机器人与人工智能爱好者论坛

 找回密码
 立即注册
查看: 5765|回复: 0
打印 上一主题 下一主题

Raspberry与Arduino建立不可靠串口通信

[复制链接]

29

主题

48

帖子

234

积分

版主

Rank: 7Rank: 7Rank: 7

积分
234
跳转到指定楼层
楼主
发表于 2015-12-3 13:57:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
Raspberry与Arduino建立不可靠串口通信




本文出自 夏日小草,转载请注明出处: http://homeway.me/2015/04/08/ras ... -arduion-by-serial/
                        


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:
  1. String readString;
  2. String data;
  3. String flag;
  4. void setup()
  5. {
  6.   Serial.begin(9600);
  7. }
  8. void loop()
  9. {
  10.     while(!Serial.available()) {}
  11.     while (Serial.available()) {
  12.         if (Serial.available() >0) {
  13.             char c = Serial.read();
  14.             readString += c;
  15.         }
  16.     }

  17.     if (readString.length() >0) {
  18.         flag = "True";
  19.         data = flag+"-"+readString;
  20.         Serial.println(data);
  21.         readString="";
  22.         delay(200);
  23.     }
  24.     Serial.flush();
  25. }
复制代码


关于Raspberry端代码:
  1. #!/usr/bin/python
  2. import serial
  3. import json
  4. import syslog,time,sys

  5. port = '/dev/tty.usbmodem1411'
  6. def main(port):
  7.     ard = serial.Serial(port,9600,timeout=1)
  8.     i = 0
  9.     send =""
  10.     time.sleep(1.5)
  11.     while (i<5):
  12.         send += 'Everything Ok~'
  13.         ard.flush()
  14.         send = str(send)
  15.         print ("Python value sent: ")
  16.         print (send)
  17.         ard.write(send)

  18.         msg = ard.readline().strip('\n\r') #ard.read(ard.inWaiting()).strip('\n\r')
  19.         print ("Message from arduino: ")
  20.         
  21.         try:
  22.             key = ['result','data']
  23.             value = msg.split('-',2)
  24.             data = dict(zip(key,value))
  25.         except:
  26.             print 'ERROR!'
  27.         print msg

  28.         time.sleep(0.3)
  29.         i = i + 1
  30.     else:
  31.         print "Exiting"
  32.     exit()

  33. if __name__ == '__main__':
  34.     try:
  35.         main(sys.argv[1] if len(sys.argv) > 1 else port )
  36.     except KeyboardInterrupt:
  37.         ser.close()
复制代码


关于端口自己查找 ls /dev/tty*
这里有2个时间延迟,第一个是做串口初始化等待,第二个是等待数据传输。





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|陕ICP备15012670号-1    

GMT+8, 2024-4-29 23:49 , Processed in 0.057011 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表