如何使用 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: "))])
我需要 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: "))])