我正在尝试通过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读取一次整数——在循环之外并全局声明它们。我也失败了。
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);
}
}