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