Python 没有接收到来自 Arduino Mega 2560 的第一行串行数据,而是接收到所有后续数据,为啥会发生这种情况?
Posted
技术标签:
【中文标题】Python 没有接收到来自 Arduino Mega 2560 的第一行串行数据,而是接收到所有后续数据,为啥会发生这种情况?【英文标题】:Python not receiving the first line of serial data from an Arduino Mega 2560, but receiving all subsequent data, why is this happening?Python 没有接收到来自 Arduino Mega 2560 的第一行串行数据,而是接收到所有后续数据,为什么会发生这种情况? 【发布时间】:2020-04-27 21:35:11 【问题描述】:我的 python 代码似乎没有从我的 Arduino 接收第一行串行数据。使用通过 Arduino 的串行监视器发送的相同命令,我可以以正确的顺序在屏幕上打印所有相同的数据点。但是当我切换到 python 时,我可以获得除第一行之外的所有数据。作为一种临时解决方法,我现在将原始的第一行数据作为最后一行数据从 arduino 发送到 python。只要它不是前导行,我的 python 代码就能够读取丢失的数据。真奇怪。这是处理串行交换的 python 代码的 sn-p:
def get_data(messageHeader, val):
"""sends and receives arduino data
Arguments:
messageHeader str -- determines which command to upload
val str -- value of input data to upload
"""
header = str(messageHeader)
value = str(val)
if header == "a":
command = "<" + header + ", " + value + ">"
print(command)
ser.write(command.encode())
if ser.readline():
time.sleep(0.5)
for x in range(0, numPoints):
data = ser.readline().decode('ascii')
dataList[x] = data.strip('\r\n')
print("AU: " + str(x) + ": " + dataList[x])
print(dataList)
else:
print("Invalid Command")
当我想从 arduino 检索串行数据时,我通过我的 python 终端发送命令“a”,因为它与 arudino 代码中内置的临时命令相匹配。
这是一些 arduino 代码:
void loop()
recvWithStartEndMarkers();
checkForSerialMessage();
void checkForSerialMessage()
if (newData == true)
strcpy(tempBytes, receivedBytes);
// this temporary copy is necessary to protect the original data
// because strtok() replaces the commas with \0
parseData();
showParsedData();
newData = false;
if (messageFromPC[0] == 'a')
ledState = !ledState;
bitWrite(PORTB, 7, ledState);
for(int i = 0; i < 6; i++)
Serial.println(threshold_longVals[i]);
for(int i = 0; i < 9; i++)
Serial.println(threshold_intVals[i]);
Serial.println(threshold_floatVal);
Serial.println(threshold_longVals[0]);
当通过 Arduino 的串行监视器发送“a”时,我会以正确的顺序收到所有 threshold_long/int/floatVals。您会注意到,在 arduino 代码的底部,我再次添加了一行来打印 threshold_longVals[0],因为出于某种我不知道的原因,从 python 端打印在屏幕上的数据以 threshold_longVals[1] 开头。我很难理解为什么它不以 threshold_longVals[0] 开头?
谢谢。
【问题讨论】:
【参考方案1】:if ser.readline():
在这里,您正在阅读第一行,但立即将其丢弃。
您需要将它存储在一个变量中,然后适当地使用它:
first_line = ser.readline()
if first_line:
# do something with first_line
【讨论】:
以上是关于Python 没有接收到来自 Arduino Mega 2560 的第一行串行数据,而是接收到所有后续数据,为啥会发生这种情况?的主要内容,如果未能解决你的问题,请参考以下文章