簡(jiǎn)單的說明在arduino官方網(wǎng)站的reference頁面有了,一般將字符通過串口打印到電腦(用USB串口)已經(jīng)夠用了,但是當(dāng)你想把把字符發(fā)送到另一個(gè)串口的時(shí)候,或是想用一塊你手頭上已有的開發(fā)板發(fā)送數(shù)據(jù)給Arduino,然后讓Arduino顯示,問題頓時(shí)變得麻煩起來!
如何從一個(gè)單片機(jī)的串口發(fā)送數(shù)據(jù)到Arduino上,然后用Arduino顯示呢?
這就要從Arduino的串口收發(fā)函數(shù)說起了.
(以下實(shí)例基于Arduino Due)
1,接收函數(shù)Serial.read( )
int Serial.read(void)
如果串行數(shù)據(jù)緩沖區(qū)有數(shù)據(jù),這個(gè)函數(shù)會(huì)讀取串行數(shù)據(jù)緩沖區(qū)的第一個(gè)字節(jié),數(shù)據(jù)讀取位置移動(dòng)到下一個(gè)數(shù)據(jù)緩沖區(qū),也就是說如果繼續(xù)讀取的話會(huì)讀取下一個(gè)數(shù)據(jù)緩沖區(qū)的第一個(gè)字節(jié).
如果數(shù)據(jù)緩沖區(qū)沒有數(shù)據(jù),將返回-1.
2,發(fā)送函數(shù)Serial.print
Serial.print(val)
Serial.print(val, format)
Serial.print(val)
首先注意: print是一個(gè)打印函數(shù),主要用于在上位機(jī)上顯示,讓數(shù)據(jù)可視化,它會(huì)將數(shù)據(jù)用字符的形式(ASCII碼)逐個(gè)發(fā)送到串口. 一般不用這個(gè)函數(shù)來進(jìn)行數(shù)據(jù)傳輸.
比如下面這段代碼不會(huì)在串口助手上顯示3個(gè)256,而會(huì)分別顯示'2','5','6'的ASCII碼值,50,53,54(分三次發(fā)送,有三個(gè)地址不同的數(shù)據(jù)緩沖區(qū))
void setup() {
// initialize serial ports:
Serial.begin(9600);
Serial1.begin(9600);
Serial3.begin(9600);
Serial3.print(256);
if (Serial1.available()>0) {
Serial.println(Serial1.read());
Serial.println(Serial1.read());
Serial.println(Serial1.read());
}
}
void loop() {
}
既然print是一個(gè)打印函數(shù),那么自然,參數(shù)val的類型是任意的.
Serial.print(val, format)
將val的值轉(zhuǎn)換成format指定的形式發(fā)送,可為BIN,OCT,HEX,DEC.
3,發(fā)送函數(shù)Serial.write
Serial.write(str)
str為字符串的首地址,buf為一個(gè)用來存放數(shù)據(jù)的數(shù)組的首地址. 這個(gè)函數(shù)會(huì)先發(fā)送字符串,然后返回字符串的長(zhǎng)度.
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45); // send a byte with the value 45
int bytesSent = Serial.write("hello");
Serial.println(bytesSent);
}
Serial.write(val)
val的數(shù)據(jù)類型為unsigned char,這個(gè)函數(shù)每次只發(fā)送一個(gè)字節(jié)的數(shù)據(jù),所以val的值在0-255之間.
Serial.write(buf, len)
buf為要發(fā)送的數(shù)組的首地址(注意數(shù)組的類型為unsigned char),len為數(shù)組的長(zhǎng)度.
void setup(){
Serial.begin(9600);
Serial3.begin(9600);
Serial1.begin(9600);
}
void loop(){
unsigned char data[2] ={11,0};
Serial3.write(data,2);
if(Serial1.available()>0)
Serial.println(Serial1.read());
Serial.println(Serial1.read());
}
回到開頭的問題,如何從一個(gè)單片機(jī)的串口發(fā)送數(shù)據(jù)到Arduino上,然后用Arduino顯示呢?
我們可以先用單片機(jī)的print函數(shù)把數(shù)據(jù)打印到串口,然后用Serial1.readBytes(Serial的加強(qiáng)版,具體看官方參考手冊(cè))把數(shù)據(jù)從串口讀取回來(以ASCII碼的形式),然后把ASCII碼轉(zhuǎn)換成字符,然后發(fā)送.
unsigned int send_data =1234;
char rx_data[4];
void setup(){
Serial.begin(9600);
Serial3.begin(9600);
Serial1.begin(9600);
}
void loop()
{
Serial3.print( send_data);
if(Serial1.available()>0)
{
Serial1.readBytes(rx_data,4);
for(char i=0;i<4;i++)
{
Serial.print(char(rx_data));
}
Serial.print("\n");
}
delay(500);
}
注意:本文的串口使用的都是板上的串口,當(dāng)和非Arduino板通信的時(shí)候注意使用TTL轉(zhuǎn)RS232電平轉(zhuǎn)接板.
(所有的代碼已驗(yàn)證)
最后,向奈何,桃子,海神致敬,謝謝你們?cè)谌荷虾驼搲蠟閺V大同胞答疑解惑(謝謝你們昨天的幫助),
順便推薦兩本書(英文至少半吊水):
1,Oreilly. Arduino.Cookbook. 2nd.Edition
相當(dāng)詳細(xì)的一本書,初學(xué)者想要的在上面幾乎都能找得到.
2,Build Wireless Sensor Network
用Zigbee+Arduino實(shí)現(xiàn)傳感器網(wǎng)絡(luò),實(shí)用,強(qiáng)大,簡(jiǎn)潔