python-serial OSError:[Errno 11]资源暂时不可用

时间:2016-03-21 14:24:00

标签: python ubuntu arduino pyserial serial-communication

我正在使用Arduino Nano与ODROID串行通信(安装了Ubuntu 14.04的单板计算机)。 Arduino代码:

void setup() {
   Serial.begin(9600); // set the baud rate
   Serial.println("Ready"); // print "Ready" once
}
void loop() {
  char inByte = ' ';
  if(Serial.available()){ // only send data back if data has been sent
    char inByte = Serial.read(); // read the incoming data
  Serial.println(inByte); 
}
  delay(100); // delay for 1/10 of a second
}   

ODROID中的Python代码:

#!/usr/bin/env python

from time import sleep
import serial
ser = serial.Serial('/dev/LIDAR', 9600, timeout=1) # Establish the connection on a specific port

sleep(1)
print "Arduino is initialized"

counter = 32 # Below 32 everything in ASCII is gibberish

while True:
    if (ser.inWaiting()>0):
      counter +=1
      ser.write(str(chr(counter))) # Convert the decimal number to ASCII then send it to the Arduino
      print ser.readline() # Read the newest output from the Arduino
      sleep(.1) # Delay for one tenth of a second
      if counter == 255:
          counter = 32

ser.close  

追溯(最近一次):

File "./serial_test1.py", line 16, in <module>        
    print ser.readline() # Read the newest output from the Arduino       
File "/usr/lib/python2.7/dis-package/serial/serialposix.py", line 43, in read   
    buf = os.read(self.fd, size-len(read))     
OSError: [Errno 11]Resource temporarily unavailable 

然后我在打印一些值后遇到了这个问题,我知道这个问题可能没有当前可用的数据。但是我怎么能弄清楚这个问题呢。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我不知道这是否适用于ODROID,但我发现了一篇关于similar problem with Raspberry PI的帖子。在该帖子中的一个答案redirected to this link

它说这些问题是由Raspberry Pi串口导致的,默认情况下使用它来使用系统控制台,当你试图将它用于你自己的目的时它会发生冲突

要禁用控制台的序列号,您必须编辑文件/etc/inittab并注释行T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100(您在行的开头用#对其进行评论,就像在python中一样)。您必须重新启动ODROID才能正常工作

我建议你阅读我链接的答案,因为它解释了更多关于如何替换串口访问命令行(它建议使用ssh)和另一件事是Raspberry PI(并假设ODROID工作类似)在启动时通过串行端口发送消息,该消息将由Arduino接收。您可以删除该消息并在那里解释

希望这有助于你

答案 1 :(得分:1)

您收到此错误,因为您自己的串行设备正在使用。你应该停止操作系统使用这个设备。

Serial getty现在是一项服务,你应该停止和/或禁用它:

sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service

请注意,我的本机串行设备ID是ttyAMA0。

永久禁用串口服务,请使用     sudo systemctl mask serial-getty@ttyAMA0.service 在这种情况下,即使重新启动,串行服务也不会启动。