如何使用 pyserial 向 Arduino 写入和读取二进制文件(非 ASCII 编码)

How to write and read binary (not ASCII encoded) to Arduino with pyserial

我需要 Raspberry Pi 与 Arduino 进行通信。我只需要 0 到 180 之间的值,这在单个字节的范围内,所以我只想以二进制形式发送值,而不是使用 ASCII 编码发送它以加快传输速度(即:如果我想写一个“123”到 Arduino,我想发送 0x7B,而不是 1、2、3 (0x31,0x32,0x33) 的 ASCII 码。

在我的测试中,我一直在尝试编写一个 Python 程序,该程序将获取该范围内的整数,然后以二进制形式通过串行发送。

这是我正在尝试的测试。我想写一个二进制数到Arduino,然后让Arduino打印出它接收到的值。

Python代码:

USB_PORT = "/dev/ttyUSB0"  # Arduino Uno WiFi Rev2

import serial

try:
   usb = serial.Serial(USB_PORT, 9600, timeout=2)
except:
   print("ERROR - Could not open USB serial port.  Please check your port name and permissions.")
   print("Exiting program.")
   exit()

while True:
    command = int(input("Enter command: "))
    usb.write(command)
    
    value = (usb.readline())
    print("You sent:", value)

这是 Arduino 代码

byte command;
void setup()
{
    Serial.begin(9600);

}

void loop()
{
    if (Serial.available() > 0)
    {
        command = Serial.read();
        Serial.print(command);
    }
    
}

所有这些给我的是:

Enter command: 1
You sent: b'0'
Enter command: 4
You sent: b'0000'

usb.write(command) 期望 command 属于 bytes 而不是 int.

似乎 write 方法内部调用了 bytes(),因为它发送了您调用它所用的零字节数。
使用整数调用 bytes(),创建一个零填充字节数组,具有指定数量的零。
如果要发送单个字节,则需要用单个元素的列表调用它。

你应该这样做:

command = bytes([int(input("Enter command: "))])