<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> Arduino >> 瀏覽文章

        Arduino和非Arduino板串口通信教程

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年05月09日   【字體:

        簡單的說明在arduino官方網站的reference頁面有了,一般將字符通過串口打印到電腦(用USB串口)已經夠用了,但是當你想把把字符發送到另一個串口的時候,或是想用一塊你手頭上已有的開發板發送數據給Arduino,然后讓Arduino顯示,問題頓時變得麻煩起來!
        如何從一個單片機的串口發送數據到Arduino上,然后用Arduino顯示呢?
        這就要從Arduino的串口收發函數說起了.
        (以下實例基于Arduino Due)
        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);
        }


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


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

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮