【发布时间】:2014-06-11 22:34:38
【问题描述】:
我有一个简单的串行控制接口(和协议),我正在扩展它以在套接字上工作(用于远程访问和没有串行端口的用户)。当前代码是跨平台的,我希望保持这种状态,并通过对工作代码的最小更改来添加网络支持。
问题在于监控每个控制端口(串行和/或连接的套接字)。我不能使用select(),因为在 Windows 上它不接受串行端口。所以我需要遍历每个端口来检查命令。因此,我将串行端口和套接字都设置为非阻塞(或视情况而定,超时时间极短)。
但是sockets使用recv()/send(),串口使用read()/write()。所以当accept()返回一个连接时,我粗暴地添加了read()和write()方法:
try: # Non-blocking parent socket throws exception when no client waiting.
conn, __ = parent_sock.accept()
conn.write = conn.send
conn.read = conn.recv
except:
pass # Nobody trying to connect()
我的处理循环如下所示:
while True:
for iface in (ser_port, conn):
try:
cmd = iface.read(256)
reply = doCmd(cmd)
iface.write(reply)
except:
pass # Not really... Handle socket exceptions.
这行得通! (至少对于初始测试而言。)但这是最好的方法吗?我怀疑那里有一个闪亮的包可以准确地处理这种情况,但到目前为止谷歌没有给我任何爱。
【问题讨论】:
标签: python sockets serial-port cross-platform