Arduino/Python串行通信写入不工作
我试图通过串口在python和arduino之间发送消息。我使用以下代码成功地实现了Arduino->python方向: python:Arduino/Python串行通信写入不工作,python,serial-port,arduino,Python,Serial Port,Arduino,我试图通过串口在python和arduino之间发送消息。我使用以下代码成功地实现了Arduino->python方向: python: import termios, fcntl, sys, os, serial, time, smtplib ser = serial.Serial('/dev/tty.usbserial-AD02AY8A', 9600, writeTimeout = 0) while 1: message = ser.readline() print(mess
import termios, fcntl, sys, os, serial, time, smtplib
ser = serial.Serial('/dev/tty.usbserial-AD02AY8A', 9600, writeTimeout = 0)
while 1:
message = ser.readline()
print(message)
阿杜伊诺:
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
Serial.write('1');
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
Serial.println("BOBBY");
delay(1); // delay in between reads for stability
}
在本例中,我可以查看arduino的串行端口和终端上的“屏幕命令”,以及通过python重印的“BOBBY”
当我尝试从python发送消息时,它从未显示在终端屏幕或Arduino串行端口上
下面是不起作用的python代码。arduino代码对这个不重要,因为我只是在监视串行端口
import termios, fcntl, sys, os, serial, time, smtplib
ser = serial.Serial('/dev/tty.usbserial-AD02AY8A', 9600, writeTimeout = 0)
time.sleep(2)
while 1:
try:
ser.write('1')
except: # catch *all* exceptions
print(e)
有点像是在黑暗中拍摄的,但是看看你的打印语句,这是Python3 您需要将所有传输编码为字节字符串,如下所示:
ser.write('1'.encode())
我尝试了带有LED的Arduino代码,以查看是否有任何内容写入端口。 毫无疑问,它一直在写。但是在Arduino中使用串行监视器并没有显示内容 以下是Arduino代码:
int ledPin = 13;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
if (Serial.available()>0){
Serial.read();
for (int i = 0; i < 5; i++){
// read the input on analog pin 0:
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(ledPin, LOW); // turn the LED on (HIGH is the voltage level)
delay(50);
}
}
}
int-ledPin=13;
//按“重置”时,设置例程运行一次:
无效设置(){
//以每秒9600位的速度初始化串行通信:
引脚模式(LED引脚,输出);
Serial.begin(9600);
}
//循环例程会一直反复运行:
void循环(){
如果(Serial.available()>0){
Serial.read();
对于(int i=0;i<5;i++){
//读取模拟引脚0上的输入:
digitalWrite(LED引脚,高);//打开LED(高是电压电平)
延迟(50);//等一下
digitalWrite(LED引脚,低);//打开LED(高是电压电平)
延迟(50);
}
}
}
根据您的代码,我认为可以安全地假设您正在Arduino上使用USB串行接口。如果是这种情况,Arduino设计为每次通过USB接口进行串行连接时重置
这将阻止它接收传输。您可以通过尝试使用python命令行而不是文件发送串行数据来测试这一点
如果可行,你有两个选择
1) 在打开端口后写入time.sleep(2)行,给Arduino重新启动的时间-或-
2) 在Arduino板上的接地引脚和复位之间安装一个10微法拉电容器
这将防止在串行端口连接时复位,并且在以后将该板用于另一个项目时可以很容易地将其删除。请尝试像这样添加
打印(ser.write('1'))
while 1:
try:
ser.write('1')
print(ser.write('1'))
except: # catch *all* exceptions
print(e)
我想如果你没有检查这个值,它是否被编码也没关系。。。。但是,当我通过串行方式发送数据时,我总是将数据编码为ascii,这样我就不会有任何问题……我的答案实际上可能在大多数python版本中编码为utf-8。延迟对我来说是有效的。或者,我在Arduino代码的setup()中添加了一行来发送字节,并在python中等待。