我正在开发一个项目,需要通过串口将一些数字从 Windows 10 中的 python 发送到 arduino uno。作为一个简单的测试,我只想通过发送“2”来打开 LED,并通过从命令提示符发送“4”来关闭 LED,尽管我希望最终能够将 0-99 中的任何数字用于不同的目的。这是我的arduino代码:
const int ledPin = 13;
byte b1, b2;
int val;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
if (Serial.available() > 1) {
b1 = Serial.read();
b2 = Serial.read();
val = ((b1-48)*10) + (b2-48);
if (val == 2) {
digitalWrite(ledPin, HIGH);
}
if (val == 4) {
digitalWrite(ledPin, LOW);
}
}
这感觉像是一种 hack,但确实有效,因为 '0' 在 ASCII 表中从 48 开始(因此 2 = 50 等),这就是当我使用以下 python 代码发送一些数字时 arduino 实际接收到的内容:
import serial
ser = serial.Serial('COM4',9600)
n = 2
s = str(n)
t = s.rjust(2,'0')
ser.write(t.encode())
所以我发现,在桌面上使用 python 3.4 时,这确实会打开我的 LED,而使用 n = 4 则会将其关闭。无论我为 n 选择什么数字,它总是返回“2”,如“2 个字节已发送”,这就是我想要的。我遇到的问题是,这在 python 3.4 中一切都很好,但是当我尝试使用 python 2.7 在我的笔记本电脑上加载这个项目时,我得到一个“2L”返回而不是“2”,并且 LED 不再亮起打开。
我的笔记本电脑和台式机都使用 pySerial 3.3,并且我已经确认,当我在台式机上使用 python 2.7 时,会发生同样的事情(不起作用),而当我在笔记本电脑上使用 python 3.4 时,它会起作用。
我需要在这个项目中使用 python 2.7,因为我想稍后添加一些额外的硬件/API,那么这个“L”附加在串行返回上的意义是什么?为什么这不适用于 python 2.7?