【问题标题】:Arduino python serial can't solve simple errorArduino python串口无法解决简单错误
【发布时间】:2022-01-10 04:10:15
【问题描述】:

我最近开始使用 Python。

我必须使用 arduino 和 raspberry pi 串行通信来进行传感器项目,并且我想试验我在传感器出现之前创建的数据。我将从 arduino 发送总共 8 条数据,发送这些数据时遇到问题。

arduino 代码:

void setup() {

Serial.begin(9600);
}
void loop() {

Serial.println(String("255") + "," + String("255") + "," + String("255")  + "," + String("21.651")  + "," + String("25.152")  + "," + String("12.051")  + "," + String("168.125") + "," + String("120"));
delay(1000);
}

arduino 方面,前三个数据将在 0-255 之间。接下来的 4 个数据将是浮点数,最后一个数据将是整数。所以这是来自传感器的数据,我敢肯定。

在python方面,是这样的:

import serial
com = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
com.reset_input_buffer()

while True :
   sensorData = com.readline().decode('utf-8').rstrip()
   temp_array = str(sensorData).split(',')
   a = temp_array[0]
   b = temp_array[1]
   c = temp_array[2]
   d = temp_array[3]
   e = temp_array[4]
   f = temp_array[5]
   g = temp_array[6]
   h = temp_array[7]
   print(c)

我遇到的错误如下:

  File "/home/gorkem/Desktop/process/8data.py", line 9, in <module>
  b = temp_array[1]
  IndexError: list index out of range

如果我尝试打印 sensorData,它会打印一次或两次空白数据。这可能是什么原因造成的?

gorkem@Gorkem-MSI:~/Desktop/process$ /bin/python3 
/home/gorkem/Desktop/process/8data.py

0,0,0,21.651,25.152,12.051,168.125,120
0,0,0,21.651,25.152,12.051,168.125,120
0,0,0,21.651,25.152,12.051,168.125,120
0,0,0,21.651,25.152,12.051,168.125,120
0,0,0,21.651,25.152,12.051,168.125,120

【问题讨论】:

  • 你能打印出你在 Python 端得到的seonsorData 吗?
  • 无关,但str(sensorData) 不是必需的,因为sensorData 已经是一个字符串。
  • @GörkemGök 将所有类似的信息放在帖子本身中,而不是在 cmets 中(cmets 中没有格式)
  • @GörkemGök 所以如果它打印为空白,这意味着您的脚本正在读取空白值,然后尝试用逗号分割,对吗?如果您不读取任何数据,您不想不进行拆分吗?显然,如果没有数据要拆分然后放入temp_array...
  • @RandomDavis split 可以在任何字符串上工作,即使字符串中根本没有分隔符,问题是在任何空响应的情况下没有包含所有 7 个数据的列表。跨度>

标签: python arduino serial-port pyserial


【解决方案1】:
import serial
com = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
com.reset_input_buffer()

while True :
   sensorData = com.readline().decode('utf-8').rstrip()
   temp_array = str(sensorData).split(',')
   if len(temp_array) > 7:
       a = temp_array[0]
       b = temp_array[1]
       c = temp_array[2]
       d = temp_array[3]
       e = temp_array[4]
       f = temp_array[5]
       g = temp_array[6]
       h = temp_array[7]
       print(c)

我建议做这样的事情来确保它正在读取的每一行实际上都包含这 7 个输入。

【讨论】:

  • 我照你说的做了。如果它只在第一次运行时给出这个错误,它可能是一个解决方案。在此之后是否有任何数据丢失的情况?
  • 不应该,如果有数据丢失,那是 Arduino 方面的问题。要么手动检查 temp_array 长度,要么只使用传感器数据 temp_array 生成一个字典。
  • @GörkemGök 您可以随时在某处记录不良数据,以便以后确保没有遗漏任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多