Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:串行端口和伪tty之间的异步读/写_Python_Pty - Fatal编程技术网

Python:串行端口和伪tty之间的异步读/写

Python:串行端口和伪tty之间的异步读/写,python,pty,Python,Pty,我正在尝试编写一个串行“代理”,它将位于进程和物理串行设备之间,并动态地重新编写一些命令。我让它以一种粗糙的方式工作,但它比直接使用物理设备慢得多 为了加快速度,我去掉了除裸读/写之外的所有内容,但性能比预期慢得多 知道我做错了什么吗?我对这种低级的东西非常陌生,我的大部分有限经验是解析json/xml/etc和操作字符串。如有任何想法或提示,将不胜感激 这是简化代码- def host_thread( host_port, dv_port ): while True:

我正在尝试编写一个串行“代理”,它将位于进程和物理串行设备之间,并动态地重新编写一些命令。我让它以一种粗糙的方式工作,但它比直接使用物理设备慢得多

为了加快速度,我去掉了除裸读/写之外的所有内容,但性能比预期慢得多

知道我做错了什么吗?我对这种低级的东西非常陌生,我的大部分有限经验是解析json/xml/etc和操作字符串。如有任何想法或提示,将不胜感激

这是简化代码-

def host_thread( host_port, dv_port ):

    while True:
        try:
            char = os.read(host_port, 1)
            os.write(dv_port, char)
        except OSError as err:
            if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK:
                pass
            else:
                raise  # something else has happened -- better reraise


def dv_thread( host_port, dv_port ):

    while True:
        try:
            char = os.read(dv_port, 1)
            os.write(host_port, char)
        except OSError as err:
            if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK:
                pass
            else:
                raise  # something else has happened -- better reraise

if __name__ == "__main__":

    host_port, slave = pty.openpty()
    print("Connect to port: %s" % os.ttyname(slave))


    fl = fcntl.fcntl(host_port, fcntl.F_GETFL)
    fcntl.fcntl(host_port, fcntl.F_SETFL, fl | os.O_NONBLOCK)

    dv_port = os.open("/dev/ttyUSB0", os.O_RDWR | os.O_NONBLOCK)

    host_thread = threading.Thread(target=host_thread, args=[host_port, dv_port])
    host_thread.start()

    dv_thread = threading.Thread(target=dv_thread, args=[host_port, dv_port])
    dv_thread.start()

    while True:
        time.sleep(.1)

首先分析您的代码:我所看到的最大问题是,您一次只能读取一个字符,因为python空间内外有多个级别的翻译,这非常缓慢,读取较大的块(如果可能,有一个超时)将比逐个字符快得多,在每个线程上调用
.join()
,而不是
while True
循环,这将消除繁忙的循环,可能会为脚本的有用部分释放更多cpu