Arduino/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

我试图通过串口在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(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中等待。