Невозможно правильно отобразить два значения с плавающей точкой из pyserial на ЖК-дисплее Arduino.

Я передал два значения с плавающей точкой с помощью pyserial на COM3, и Arduino приняла эти значения.

Но первое значение на ЖК-дисплее отобразилось правильно, второе значение не удалось прочитать, и на ЖК-дисплее появилось «nan».

Код Python:

import serial
import struct
ser =serial.Serial("COM3", 115200, timeout=2)

##======Get  Ready================
print("Connecting to Arduino.....")
for i in range (1,10):
    rv=ser.readline()
    print("Loading...")
    #Debug print (rv) # Read the newest output from the Arduino
    print (rv.decode("utf-8")) 
    ser.flushInput()
    sleep(1) # Delay for one tenth of a secon
    Str=rv.decode("utf-8")
    #Debug print(Str[0:5])
    if Str[0:5]=="Ready":  
          print("Get Arduino Ready !")
          break
##------------------------------------------------------
d = 77.25
a = 111.32
ser.write(struct.pack('>2f',d,a))

Код Arduino:

#include <LiquidCrystal.h>
float x;
byte *xdata = (byte *) & x;
float y;
byte *ydata = (byte *) & y;
int num = 0;
char coor[2];

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin(115200); // установить скорость передачи данных
  Serial.println("Ready"); // напечатайте "Готово" один раз
  // устанавливаем количество столбцов и строк ЖК-дисплея:
  lcd.begin(16, 2);
  // Вывести сообщение на ЖК-дисплей.
}

void loop(){
  while(Serial.available() > 0){
    for(int i = 0; i < 2; i++){
      coor[i] = Serial.read();
      }
    if(coor[0] == 'B' ){
      xdata[3] = coor[0];
      ydata[3] = coor[1];
      num = 1;
    } else if(num == 1){
      xdata[2] = coor[0];
      ydata[2] = coor[1];
      num++;
    } else if(num == 2){
      xdata[1] = coor[0];
      ydata[1] = coor[1];
      num++;
    } else if(num == 3){
      xdata[0] = coor[0];
      ydata[0] = coor[1];
      num = 0;
    // используем значения
    Serial.write(xdata,4);
    Serial.write(ydata,4);
    lcd.print(x);
    lcd.setCursor(8,0);
    lcd.print(y);
      }
    }

ЖК-монитор покажет 77,25 и nan. Он не может правильно показать 111,32.

, 👍0


1 ответ


Лучший ответ:

0

Я не понимаю, почему вы считываете байты таким образом. Ваша изначальная версия считывала только байты первого float в xdata и -1 в ydata. (read возвращает -1, если данные недоступны, он не ждет.) Теперь, когда два байта считываются с помощью readBytes, первые два байта первого float записываются один в xdata[0], а второй в ydata[0].

прочитайте первое число с плавающей точкой с помощью readBytes(xdata, 4), а второе с помощью readBytes(ydata, 4)

,