Arduino和Python之间的串行通信发送/接收数据
Posted
技术标签:
【中文标题】Arduino和Python之间的串行通信发送/接收数据【英文标题】:Serial communication sending/receiving data between Arduino and Python 【发布时间】:2015-09-16 09:51:30 【问题描述】:我已经通过 USB 串行通信连接了 Arduino 和 Raspberry Pi。在 Raspeberry 端,Python 代码必须使用以下附加代码读取三个超声波传感器。因此,根据传感器信息,Python 将通过字符串发送命令,例如M, 2000, 1500 驱动机器人的两个***。问题是每次我运行 python 代码时,它都会丢失一些数字或逗号,例如,如果 Arduino 发送 200、122、60(左、中、右)距离,在 python 端,我会收到一些相同的数据,但大部分时间在那里是缺少的数字甚至是逗号,因此拆分功能会显示错误,因为如果我在读取时丢失了逗号而不是三个传感器,那么它将就像两个传感器一样。
import serial
import time
import string
DEVICE = '/dev/ttyACM0'
BAUD = 9600
ser= serial.Serial(DEVICE, BAUD)
while (1==1):
Sensors_Data=ser.readline()
print Sensors_Data
(left_distance, centre_distance, right_distance)=[int(s) for s in Sensors_Data.split(',')]
print left_distance
print centre_distance
print right_distance
if (centre_distance<50):
ser.write('M%4d' %1500)
ser.write('M%4d' %1500)
else:
ser.write('M%4d' %1600)
ser.write('M%4d' %1500)
【问题讨论】:
你能在这里打印输出 Sensors_Data 吗? 另外,您的拆分功能出错是什么意思?结果不正确? 1- Sensors_Data 的输出为 0, 93,0 ; 0,96,0 等等。 1- Sensors_Data 的输出为 0, 93,0 ; 0,96,0 等等。如果 Sensors_Data 始终如此,则没有问题。但只是意外地 Sensor_Data 打印了 093,0 或 0,9,0,因此拆分功能不起作用,因为它应该始终接收 x,y,x。此外,如果您查看代码的末尾,如果 center_distance 小于 50,我会发送一个字符串,即 M,1500,1500 到 arduino 以停止电机。但是,有时我也看到 Sensors_Data 的输出与字符串的值混合在一起,例如 0, 93,0M 0r 0,96,01500,这显然是错误的。 【参考方案1】:首先让我们确保您没有多余的字符,例如换行符和回车符。
import serial
import time
import string
DEVICE = '/dev/ttyACM0'
BAUD = 9600
ser= serial.Serial(DEVICE, BAUD)
while (1==1):
Sensors_Data=ser.readline().encode('string-escape')
print Sensors_Data # This should show you what all is there.
Sensors_Data = Sensors_Data.split('\r\n')[0] # Assuming you have a carriage return and a newline, which is typical.
(left_distance, centre_distance, right_distance)=[int(s) for s in Sensors_Data.split(',')]
print left_distance
print centre_distance
print right_distance
if (centre_distance<50):
ser.write('M%4d' %1500)
ser.write('M%4d' %1500)
else:
ser.write('M%4d' %1600)
ser.write('M%4d' %1500)
【讨论】:
我已经根据你的修改了我的代码。在 Arduino 串行监视器上,它是 0、63、0,但如果您注意到第一个逗号缺少错误消息,python 会将 Sensors_Data 打印为 063,0\r\n 是“Traceback(最近一次调用最后一次):文件”/home/ pi/Raspberry_Arduino/Example_3/Raspberry_Arduino_Ex_3.py",第 23 行,在以上是关于Arduino和Python之间的串行通信发送/接收数据的主要内容,如果未能解决你的问题,请参考以下文章
Arduino 和 Python (3.x) 之间的 Serial.read() 和 Struct.pack / 串行通信问题
使用串行通信在 python 和 arduino 之间进行同步