http://homeway.me/python
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
這裏串口的波特率設置成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個時間延遲,第一個是作串口初始化等待,第二個是等待數據傳輸。
2015-08-11 20:56:20