【问题标题】:Mix serial ports and sockets cross-platform?跨平台混合串口和套接字?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多