久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當前位置:單片機教程網(wǎng) >> Arduino >> 瀏覽文章

Arduino和非Arduino板串口通信教程

作者:huqin   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年05月09日   【字體:

簡單的說明在arduino官方網(wǎng)站的reference頁面有了,一般將字符通過串口打印到電腦(用USB串口)已經(jīng)夠用了,但是當你想把把字符發(fā)送到另一個串口的時候,或是想用一塊你手頭上已有的開發(fā)板發(fā)送數(shù)據(jù)給Arduino,然后讓Arduino顯示,問題頓時變得麻煩起來!
如何從一個單片機的串口發(fā)送數(shù)據(jù)到Arduino上,然后用Arduino顯示呢?
這就要從Arduino的串口收發(fā)函數(shù)說起了.
(以下實例基于Arduino Due)
1,接收函數(shù)Serial.read( )
int Serial.read(void)
如果串行數(shù)據(jù)緩沖區(qū)有數(shù)據(jù),這個函數(shù)會讀取串行數(shù)據(jù)緩沖區(qū)的第一個字節(jié),數(shù)據(jù)讀取位置移動到下一個數(shù)據(jù)緩沖區(qū),也就是說如果繼續(xù)讀取的話會讀取下一個數(shù)據(jù)緩沖區(qū)的第一個字節(jié).
如果數(shù)據(jù)緩沖區(qū)沒有數(shù)據(jù),將返回-1.


2,發(fā)送函數(shù)Serial.print

Serial.print(val)
Serial.print(val, format)


Serial.print(val)
首先注意: print是一個打印函數(shù),主要用于在上位機上顯示,讓數(shù)據(jù)可視化,它會將數(shù)據(jù)用字符的形式(ASCII碼)逐個發(fā)送到串口.    一般不用這個函數(shù)來進行數(shù)據(jù)傳輸.
比如下面這段代碼不會在串口助手上顯示3個256,而會分別顯示'2','5','6'的ASCII碼值,50,53,54(分三次發(fā)送,有三個地址不同的數(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是一個打印函數(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為一個用來存放數(shù)據(jù)的數(shù)組的首地址. 這個函數(shù)會先發(fā)送字符串,然后返回字符串的長度.


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,這個函數(shù)每次只發(fā)送一個字節(jié)的數(shù)據(jù),所以val的值在0-255之間.


Serial.write(buf, len)
buf為要發(fā)送的數(shù)組的首地址(注意數(shù)組的類型為unsigned char),len為數(shù)組的長度.


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());
}

回到開頭的問題,如何從一個單片機的串口發(fā)送數(shù)據(jù)到Arduino上,然后用Arduino顯示呢?
我們可以先用單片機的print函數(shù)把數(shù)據(jù)打印到串口,然后用Serial1.readBytes(Serial的加強版,具體看官方參考手冊)把數(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);
}


注意:本文的串口使用的都是板上的串口,當和非Arduino板通信的時候注意使用TTL轉(zhuǎn)RS232電平轉(zhuǎn)接板.
(所有的代碼已驗證)
最后,向奈何,桃子,海神致敬,謝謝你們在群上和論壇上為廣大同胞答疑解惑(謝謝你們昨天的幫助),


順便推薦兩本書(英文至少半吊水):
1,Oreilly.  Arduino.Cookbook.   2nd.Edition
相當詳細的一本書,初學(xué)者想要的在上面幾乎都能找得到.
2,Build Wireless Sensor Network
用Zigbee+Arduino實現(xiàn)傳感器網(wǎng)絡(luò),實用,強大,簡潔

關(guān)閉窗口
主站蜘蛛池模板: 波多野结衣一区二区 | 国产真实精品久久二三区 | 久久国产精品一区 | 一区二区三区在线免费观看 | 亚洲精选一区二区 | 好好的日在线视频 | 日韩在线一区二区三区 | 在线播放第一页 | 黄a大片| 国产一区二区在线免费观看 | 福利视频网址 | 九色av| 久久久人成影片一区二区三区 | 日韩a在线 | 国产欧美一区二区三区另类精品 | 天天爽一爽 | 九色91视频 | jizz在线看片| 中文字幕二区 | 亚洲国产成人精品女人久久久 | 亚洲欧美精品国产一级在线 | 91久久精品一区二区二区 | 久久三区| 精品国产18久久久久久二百 | 精品欧美一区二区三区久久久 | 亚洲视频在线播放 | 91精品久久久久久久久中文字幕 | 国产精品久久久久久久久免费丝袜 | 色啪网| 国产精品一二三区 | 91传媒在线播放 | 午夜手机在线视频 | 99精品国产一区二区青青牛奶 | 高清欧美性猛交xxxx黑人猛交 | 午夜不卡福利视频 | 亚洲国产成人精品女人久久久野战 | 一区二区国产精品 | 在线中文字幕视频 | 久久成人精品视频 | 久久精品综合 | 欧美成人精品激情在线观看 |