我有一个简单的串行控制接口(和协议),我扩展到也适用于套接字(用于远程访问和没有串行端口的用户)。当前的代码是跨平台的,我希望保持这种方式,并且只需对工作代码进行最小的更改即可添加网络支持。
问题是监控每个控制端口(串行和/或连接的插座)。我无法使用select()
,因为在Windows上它不会接受串行端口。所以我需要迭代每个端口来检查命令。因此,我将串行端口和套接字设置为非阻塞(或适当时超短暂超时)。
但是套接字使用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.
这个有效! (至少对于初步测试。)但这是最好的方法吗?我怀疑那里有一个闪亮的包装来处理这种情况,但到目前为止谷歌没有给我任何爱。
答案 0 :(得分:0)
我建议你在获得它们时区分连接类型;然后记录此信息(即conn.method ='serial')或创建或返回相应的连接对象(例如SerialConnection或SocketConnection:实现泛型read()或write()方法的类,并抽象方法之间的底层差异)