我正在尝试用Python从Arduino读取串行输入。我正在尝试做一个简单的任务——我的Arduino有一个按钮可以写入其状态。这是Arduino的代码:
const int ledPin = 7;
const int buttonPin = 2;
int buttonState= 0;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
buttonState = digitalRead(buttonPin);
if(buttonState == LOW){ digitalWrite(ledPin, HIGH);} else digitalWrite(ledPin, LOW);
Serial.println(buttonState);
delay(50);
}
使用Arduino 1.8.13软件中的串行监视器,我可以看到它打印0或1
我试图用Python中的以下代码阅读它:
import serial
ser = serial.Serial('COM10', baudrate = 9600, timeout = 1)
t = 0
while t<10:
arduinoData = ser.readline().decode()
print(arduinoData)
t+=1
print(type(arduinoData))
ser.close()
我读取前10个输入并打印arduinoData
的类型,在本例中是字符串,因为我使用的是.decode()
。然而,我不能使用像arduinoData=='1'
这样的布尔运算符来做任何事情,即使它被解码为字符串。我试过使用.decode('ascii')
,.decode('UTF-8')
但没有用
如何检查这些值,或者如何废弃.decode()
并将字节转换为简单整数,然后使用布尔运算符?
我正在使用Python3.9和Arduino Uno
更新1
在Python中,我以这种方式将它从str
转换为int
:
import serial
ser = serial.Serial('COM10', baudrate = 9600, timeout = 1)
t=0
while t<10:
arduinoData = ser.readline().decode()
print(arduinoData)
t+=1
if(int(arduinoData) == 1):
print("Input is 1")
ser.close()
这样,我可以看到我的串行输入实际上等于1。但是,如果它不等于1,我希望做一些事情。因此,我将检查放入循环中,如下所示:
import serial
ser = serial.Serial('COM10', baudrate = 9600, timeout = 1)
t=0
while t<10:
arduinoData = ser.readline().decode()
print(arduinoData)
if(int(arduinoData) == 1):
print("Input is 1")
t+=1
ser.close()
并获取以下错误:
Traceback (most recent call last):
File "C:\Users\01132892\Desktop\Serial\SerialButtonPurple.py", line 12, in <module>
if(int(arduinoData) == 1):
ValueError: invalid literal for int() with base 10: ''
我假设这是一个在循环内转换它的问题,但是我不知道如何解决它
我的Python不是很好,但是也许ser.readline()也会返回EOL?如果是这样,
arduinoData
不只是包含“1”如果我是对的,如果你去掉EOL,它应该会起作用
或者:让Arduino使用
Serial.print(buttonState);
发送单个字节,并使用ser.read()
读取Python中的单个字节。在发送和读取单个字节时,不需要分隔符好的,我已经设法解决了这个问题。 请注意,为了检查它是否在主回路中工作,如果按钮未按下(信号读数为0),我按“a”键,如果信号为1,则释放它
我要感谢ocrdu建议使用
rstrip()
来摆脱EOL相关问题 更多 >
编程相关推荐