通过 Python 串口向 Arduino 发送和读取整数不一致

问题描述 投票:0回答:1

我正在尝试通过Python和串行通信将整数发送到Arduino,在那里读取它,然后将其发回(仅用于调试)以通过Python进行打印。

我经常收到返回的零或整数的顺序错误。我正在撞墙。我回到了一个最小的例子,但仍然看不到我的错误。

Arduino代码:

uint32_t val1;
uint32_t val2;
uint32_t val3;


void setup() {
  Serial.begin(115200);
}

void loop() {
  if (Serial.available() > 0) {
    // read values from Python
    val1 = Serial.parseInt();
    val2 = Serial.parseInt();
    val3 = Serial.parseInt();
  }
  
  if (Serial.available() > 0) {
    // Print received values for reading back to Python
    Serial.println(val1);
    Serial.println(val2);
    Serial.println(val3);
  }
}

Python代码:

import serial
import time

port = '/dev/cu.usbmodem14301'
ser = serial.Serial(port, baudrate=115200, timeout=None)

# Wait for Arduino to initialize
time.sleep(2)

#flush input buffer
ser.reset_input_buffer()


# define three parameters/integers to send in a list
numbers = [123, 60000, 789] #max integer is 2^15-1 for normal int in Arduino, we use uint32_t in Arduino, which is an unsigned 32bit -> 2^32-1

# send to Arduino as csv
for num in numbers:
    ser.write(str(num).encode())
    ser.write(b',')  # Send comma as delimiter

# Read the response from Arduino
response = []
for _ in range(len(numbers)):
    data = ser.readline().strip()
    response.append(data.decode())

# Close the serial port
ser.close()

# Print the response
print("Response from Arduino:", response)

还有可能只从Python读取一次整数——在循环之外并全局声明它们。我也失败了。

python arduino serial-port
1个回答
0
投票

Arduino 代码有错误。你有 50% 的机会先写然后读。请注意,字符可能随时到达。这样的改变可能会有所帮助。一般来说,在传输数据时,两个节点之间需要一些同步。例如,换行字符的方向相反。

uint32_t val1;
uint32_t val2;
uint32_t val3;


void setup() {
  Serial.begin(115200);
}

void loop() {
  if (Serial.available() > 0) {
    // read values from Python
    val1 = Serial.parseInt();
    val2 = Serial.parseInt();
    val3 = Serial.parseInt();
    // Print received values for reading back to Python
    Serial.println(val1);
    Serial.println(val2);
    Serial.println(val3);
  }
  
}
© www.soinside.com 2019 - 2024. All rights reserved.