Python не получает первую строку последовательных данных от Arduino Mega 2560, но получает все последующие данные, почему это происходит? - PullRequest
0 голосов
/ 28 апреля 2020

Мой python код, похоже, не получает первую строку последовательных данных от моего Arduino. С помощью тех же команд, посылаемых через последовательный монитор Arduino, я могу вывести на экран все те же точки данных в правильном порядке. Но когда я переключаюсь на python, я могу получить все данные, кроме самой первой строки. В качестве временного решения я сейчас отправляю исходную первую строку данных в качестве последней строки данных из arduino на python. Мой код python может читать эти отсутствующие данные, если они не являются лидирующей строкой. Это странно. Вот фрагмент кода python, который обрабатывает последовательный обмен:

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")

Я посылаю команду «a» через мой терминал python, когда я хочу получить последовательные данные из arduino, потому что это соответствует временной команде, встроенной в код 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 Ответ

2 голосов
/ 28 апреля 2020
if ser.readline():

Здесь вы читаете первую строку, но сразу отбрасываете ее.

Вам необходимо сохранить ее в переменной и затем использовать ее соответствующим образом:

first_line = ser.readline()
if first_line:
    # do something with first_line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...