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 行,在 (left_distance, center_distance, right_distance)=[int(s) for s in Sensors_Data.split(',')] ValueError: invalid literal for int( ) 以 10 为底:'0\\r\\n'" 我希望您不要同时使用串行监视器和运行此 python 脚本,这可能会损坏您的数据。 其实这两种情况我都试过了。另外,当我运行 python 并且串行监视器没有运行时,我遇到了同样的问题。我认为问题仅出在 readline() 中,因为它读取的字符串与 Arduino 上的字符串不完全相同。我没有我必须做的事吗? 刚才又看到你写的错误了。您能否尝试将拆分语句更改为 Sensors_Data.split('\\r\\n')[0] 谢谢,我已经尝试过了,不幸的是它也不起作用。这个语句“encode('string-escape')”将 \r\n 添加到我的字符串(传感器数据)中,所以我肯定会出错,因为我的拆分功能只需要三个传感器数据,用逗号分隔,无需任何添加。我已经通过使用相同的代码解决了这个问题,但在 Arduino 方面,除了传感器数据之外,我没有发送任何其他内容。 Python 混合在传感器数据字符串 xxx,yyy,zzz 和同样从 Arduino 发送的电机刺 M,1500,1500 之间。

以上是关于Arduino和Python之间的串行通信发送/接收数据的主要内容,如果未能解决你的问题,请参考以下文章

Arduino 和 Python (3.x) 之间的 Serial.read() 和 Struct.pack / 串行通信问题

使用串行通信在 python 和 arduino 之间进行同步

Microsoft Visual C++ 2010 和 Arduino UNO 之间通过 USB 进行串行通信

arduino 怎么和上位机通信

Arduino - Unity串行通信

Raspberry Pi 和 Arduino 之间的简单 2 路串行通信