我有此代码用于将文件大小从 linux 机器发送到嵌入式设备:
#send length
device_port = serial.Serial("/dev/ttyUSB1", 115200, timeout=3)
device_port.write(program_length_str)
#get response
answer = device_port.readline()
if answer != "OK":
print "Size transmit failed:"
print `answer`
device_port.close()
quit()
问题是当我运行这段代码(它总是在这里退出)时,程序员(通过同一个串行端口将固件加载到设备)退出并出现bad file descriptor
错误。重新插入设备(其中没有内部能源)没有帮助,我必须重新启动计算机。Python代码有什么问题?即使重新插入设备(FT2232),错误的设置怎么可能仍然存在?
用cutecom打开端口可以对设备进行编程,但是当我再次关闭它时,错误又回来了。
更新1:使用strace
我发现第一个区别在于锁:
open("//var/lock/LCK..ttyUSB1", O_RDONLY) = 4在成功加载的开始,
open("//var/lock/LCK..ttyUSB1", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
关于失败。第二个区别(以及整个错误)可能是加载程序中的错误,所以我在工具链论坛上写了(他们认为read()
返回 0 是错误,调用perror()
,但没有错误,所以 EBAFD 存储在之前的 errno 中) . 但我对锁很好奇。我在cutecom 或python 脚本(使用strace)中找不到任何参考,但锁受到了某种影响。是否可以将此问题迁移到 Unix 和 Linux 站点?
更新2:正如我之前提到的,问题是read()
串口返回0。当我专注于此时,我发现read()应该阻塞或在非阻塞模式下返回EAGAIN。在什么情况下 read() 调用可以返回 0?
更新3:我通过select()
调用设备来“解决”加载程序的问题。PySerial 更改端口中的某些内容仍然存在问题。