机器人与人工智能爱好者论坛
标题:
Raspberry与Arduino建立不可靠串口通信
[打印本页]
作者:
luckZhang
时间:
2015-12-3 13:57
标题:
Raspberry与Arduino建立不可靠串口通信
Raspberry与Arduino建立不可靠串口通信
本文出自 夏日小草,转载请注明出处:
http://homeway.me/2015/04/08/ras ... -arduion-by-serial/
logo-arduino.png
(45.17 KB, 下载次数: 607)
下载附件
2015-12-3 13:55 上传
0x01.About
Arduino与Raspberry通过Serial通信的方案一般有两种,通过树莓派GPIO串口通信,还有,通过USB串口通信。
显然,通过USB通信比GPIO通信高效稳定多了。
看过TCP握手通信的人都应该明白,通信双方通信要通过3此握手才能开启TCP连接。
相同的,串口通信也是可以这么理解,我之前尝试通过简单地发送与接收来传递信息,发现,不但有信息丢包,而且各种问题。
举个例子,A->R,A串口写入,R串口监听;R->A,R写入时候,A监听。
那么好了,时间怎么约定?A写入要多久?B要监听多久?我们都知道,Arduino是单线程的,所以Arduino的串口通信是单信道。
0x02.Coding
这里串口的波特率设置成9600,所以还要做串口波特率修改(你可以用原始的 115200),但是对树莓派的性能不要指望太多,太快不好。
关于修改串口波特率可以看这里,或者你懒不改也行:
http://blog.miguelgrinberg.com/post/a-cheap-bluetooth-serial-port-for-your-raspberry-pi
这里Arduino输出是string格式,我们要在树莓派那里转成dict字典模式方便调用,所以,约定数据格式为
{'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://robot-ai.org/)
Powered by Discuz! X3.2