Arduino-串口函數Serial


 串口是Arduino與其它設備進行通信的接口,我們需要很好的掌握它的使用。Arduino串口使用相關的函數共有10個(隨着版本的升級,新版本加入了更多,具體請參見官網:http://www.arduino.cc/)。

  

  Serial.begin(); //開啟串行通信接口並設置通信波特率

    Serial.end();    //關閉通信串口

    Serial.available();//判斷串口緩沖器是否有數據裝入

    Serial.read();    //讀取串口數據

    Serial.peek();    //返回下一字節(字符)輸入數據,但不刪除它

    Serial.flush();    //清空串口緩存

    Serial.print();    //寫入字符串數據到串口

    Serial.println();   //寫入字符串數據+換行到串口

    Serial.write();     //寫入二進制數據到串口

    Serial.SerialEvent();//read時觸發的事件函數

    Serial.readBytes(buffer,length);//讀取固定長度的二進制流

    Serial.println(incomingByte, DEC);//打印接到數據十進制表示的ascii碼。  HEX 十六進制表示

 

    peek():功能類似於read(),但是我們知道當調用一次read()后,緩沖區的數據流會被讀取並刪除read過的數據,也就是available值會減少,但peek()不會出現類似情況,其功能類似於檢測緩沖區的頭部數據,反復調用peek()返回的值是一樣的。用得好的話可以精簡很多代碼。

    write():寫入二進制數據到串行端口。這個數據是作為一個字節或字節序列發送的。如果發送字符串則需要用到print方法。

        最后注意一下:當燒程序入板卡的時候,在完成前即L、TX、RX燈閃爍前,斷開數據線很可能損壞硬件。同時測試前養成按一次reset鍵復位的習慣,這里特別注意,在打開串口監視器后,需要reset一次,否則無法看到效果。

還有一個問題:

  一般將字符通過串口打印到電腦(用USB串口)已經夠用了,但是當你想把把字符發送到另一個串口的時候,或是想用一塊你手頭上已有的開發板發送數據給Arduino,然后讓Arduino顯示,問題頓時變得麻煩起來!
如何從一個單片機的串口發送數據到Arduino上,然后用Arduino顯示呢?
這就要從Arduino的串口收發函數說起了.
(以下實例基於Arduino UNO)


1,接收函數Serial.read()

int Serial.read(void)

 


如果串行數據緩沖區有數據,這個函數會讀取串行數據緩沖區的第一個字節,數據讀取位置移動到下一個數據緩沖區,也就是說如果繼續讀取的話會讀取下一個數據緩沖區的第一個字節.
如果數據緩沖區沒有數據,將返回-1.


2,發送函數Serial.print()

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

 


Serial.print(val)
首先注意: print是一個打印函數,主要用於在上位機上顯示,讓數據可視化,它會將數據用字符的形式(ASCII碼)逐個發送到串口.    一般不用這個函數來進行數據傳輸.
比如下面這段代碼不會在串口助手上顯示3個256,而會分別顯示'2','5','6'的ASCII碼值,50,53,54(分三次發送,有三個地址不同的數據緩沖區)

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是一個打印函數,那么自然,參數val的類型是任意的.


Serial.print(val, format)
將val的值轉換成format指定的形式發送,可為BIN,OCT,HEX,DEC.


3,發送函數Serial.write
Serial.write(str)
str為字符串的首地址,buf為一個用來存放數據的數組的首地址. 這個函數會先發送字符串,然后返回字符串的長度.

 

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的數據類型為unsigned char,這個函數每次只發送一個字節的數據,所以val的值在0-255之間.


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

 

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

 

回到開頭的問題,如何從一個單片機的串口發送數據到Arduino上,然后用Arduino顯示呢?
我們可以先用單片機的print函數把數據打印到串口,然后用Serial1.readBytes(Serial的加強版,具體看官方參考手冊)把數據從串口讀取回來(以ASCII碼的形式),然后把ASCII碼轉換成字符,然后發送.

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM