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 的第一行串行数据,而是接收到所有后续数据,为啥会发生这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

如何同时从 python 发送和接收数据到 arduino

如何将接收到的数字一分为二

python和arduino之间的串行通信

在循环arduino中接收套接字(用套接字中断while循环)

arduino接收16进制数据?

串行python到arduino