Raspberry與Arduino創建不可靠串口通訊

http://homeway.me/python


0x01.About

Arduino與Raspberry經過Serial通訊的方案通常有兩種,經過樹莓派GPIO串口通訊,還有,經過USB串口通訊。json

顯然,經過USB通訊比GPIO通訊高效穩定多了。oop

看過TCP握手通訊的人都應該明白,通訊雙方通訊要經過3此握手才能開啓TCP鏈接。post

相同的,串口通訊也是能夠這麼理解,我以前嘗試經過簡單地發送與接收來傳遞信息,發現,不但有信息丟包,並且各類問題。性能

舉個例子,A->R,A串口寫入,R串口監聽;R->A,R寫入時候,A監聽。ui

那麼好了,時間怎麼約定?A寫入要多久?B要監聽多久?咱們都知道,Arduino是單線程的,因此Arduino的串口通訊是單信道。spa

0x02.Coding

這裏串口的波特率設置成9600,因此還要作串口波特率修改(你能夠用原始的 115200),可是對樹莓派的性能不要期望太多,太快很差。線程

關於修改串口波特率能夠看這裏,或者你懶不改也行:http://blog.miguelgrinberg.com/post/a-cheap-bluetooth-serial-port-for-...code

這裏Arduino輸出是string格式,咱們要在樹莓派那裏轉成dict字典模式方便調用,因此,約定數據格式爲blog

{'result':True/False, 'data':'...'},在Arduino端用 - 斷開字符串。

好了,下面是Arduino:

String readString; 
String data;
String flag;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
    while(!Serial.available()) {}
    while (Serial.available()) {
        if (Serial.available() >0) {
            char c = Serial.read();
            readString += c;
        }
    }

    if (readString.length() >0) {
        flag = "True";
        data = flag+"-"+readString;
        Serial.println(data);
        readString="";
        delay(200);
    }
    Serial.flush();
}

關於Raspberry端代碼:

#!/usr/bin/python
import serial
import json
import syslog,time,sys

port = '/dev/tty.usbmodem1411'
def main(port):
    ard = serial.Serial(port,9600,timeout=1)
    i = 0
    send =""
    time.sleep(1.5)
    while (i<5):
        send += 'Everything Ok~'
        ard.flush()
        send = str(send)
        print ("Python value sent: ")
        print (send)
        ard.write(send)

        msg = ard.readline().strip('\n\r') #ard.read(ard.inWaiting()).strip('\n\r') 
        print ("Message from arduino: ")

        try:
            key = ['result','data']
            value = msg.split('-',2)
            data = dict(zip(key,value))
        except:
            print 'ERROR!'
        print msg

        time.sleep(0.3)
        i = i + 1
    else:
        print "Exiting"
    exit()

if __name__ == '__main__':
    try:
        main(sys.argv[1] if len(sys.argv) > 1 else port )
    except KeyboardInterrupt:
        ser.close()

關於端口本身查找 ls /dev/tty*

這裏有2個時間延遲,第一個是作串口初始化等待,第二個是等待數據傳輸。




本文出自 夏日小草,轉載請註明出處: http://homeway.me/2015/04/08/raspberry-connect-to-arduion-by-serial/

by 小草

2015-08-11 20:56:20

相關文章
相關標籤/搜索