Arduino / Python串行通信写不起作用

时间:2014-04-28 03:51:39

标签: python serial-port arduino

我试图通过串口在python和arduino之间发送消息。我使用以下代码成功进入Arduino-> 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)

Arduino:

// 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的串口和终端上的“screen命令”,以及通过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)

4 个答案:

答案 0 :(得分:2)

从您的代码中我认为可以安全地假设您正在使用Arduino上的USB串行接口。如果是这种情况,Arduino可以在每次通过USB接口进行串行连接时进行重置。

这将使其不接收传输。您可以通过尝试使用python命令行而不是文件发送串行来测试这一点。

如果可行,您有两个选择,

1)在打开端口后写入time.sleep(2)行,以便重新启动Arduino时间。 -OR -

2)在接地引脚和Arduino板上的复位之间安装一个10微法拉电容。

这将防止它在串行端口连接时进入复位状态,并且可以在以后将电路板用于其他项目时轻松删除。

答案 1 :(得分:1)

我尝试使用带有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);   
        } 
       }
      }

答案 2 :(得分:0)

请尝试这样添加print(ser.write('1'))

while 1:
  try:
    ser.write('1')
   print(ser.write('1'))
  except: # catch *all* exceptions
    print(e)

答案 3 :(得分:-1)

在黑暗中拍摄,但看着你的打印声明,这是python 3。

您需要将所有传输编码为字节字符串,如下所示:

ser.write('1'.encode())