混合串口和套接字跨平台?

时间:2014-06-11 22:34:39

标签: python sockets serial-port cross-platform

我有一个简单的串行控制接口(和协议),我扩展到也适用于套接字(用于远程访问和没有串行端口的用户)。当前的代码是跨平台的,我希望保持这种方式,并且只需对工作代码进行最小的更改即可添加网络支持。

问题是监控每个控制端口(串行和/或连接的插座)。我无法使用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.

这个有效! (至少对于初步测试。)但这是最好的方法吗?我怀疑那里有一个闪亮的包装来处理这种情况,但到目前为止谷歌没有给我任何爱。

1 个答案:

答案 0 :(得分:0)

我建议你在获得它们时区分连接类型;然后记录此信息(即conn.method ='serial')或创建或返回相应的连接对象(例如SerialConnection或SocketConnection:实现泛型read()或write()方法的类,并抽象方法之间的底层差异)