Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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 转义序列中断串行客户端_Python_Terminal_Serial Port_Pyserial_Ansi Escape - Fatal编程技术网

Python 转义序列中断串行客户端

Python 转义序列中断串行客户端,python,terminal,serial-port,pyserial,ansi-escape,Python,Terminal,Serial Port,Pyserial,Ansi Escape,我正在使用pyserial为网络设备编写一个客户端,它在登录到设备后,在收到设备提示之前,会挂起几秒钟。通过对行中的字节进行跟踪,我发现以下转义序列是阻塞的原因: 0003a0 73 65 20 6c 65 76 65 6c 0d 0a 0d 1b 5b 39 39 39 |se level....[999| 0003b0 39 42 0d 1b 5b 39 39 39 39 42 1b 5a 20 20 1b 5b |9B..[9999B.Z .[| 0003

我正在使用
pyserial
为网络设备编写一个客户端,它在登录到设备后,在收到设备提示之前,会挂起几秒钟。通过对行中的字节进行跟踪,我发现以下转义序列是阻塞的原因:

0003a0  73 65 20 6c 65 76 65 6c  0d 0a 0d 1b 5b 39 39 39       |se level....[999|
0003b0  39 42 0d 1b 5b 39 39 39  39 42 1b 5a 20 20 1b 5b       |9B..[9999B.Z  .[|
0003c0  36 6e 0d 0d 0d 0d 5b 61  64 6d 69 6e 40 73 77 69       |6n....[admin@swi|
0003d0  74 63 68 5d 20 3e 20 20  20 20 20 20 20 20 20 20       |tch] >          |
使用
screen
连接到设备时,由于
screen
响应正确,因此不会出现延迟

0003a0  73 65 20 6c 65 76 65 6c  0d 0a 0d 1b 5b 39 39 39       |se level....[999|
0003b0  39 42 0d 1b 5b 39 39 39  39 42 1b 5a 20                |9B..[9999B.Z    |

                                ---=== WRITE ===---
000000  1b 5b 3f 31 3b 32 63                                   |.[?1;2c         |

                                ---=== READ ===---
000000  20 1b 5b 36 6e                                         | .[6n           |

                                ---=== WRITE ===---
000000  1b 5b 35 37 3b 33 52                                   |.[57;3R         |

                                ---=== READ ===---
000000  1b 5b 34 6c 1b 5b 32 30  6c 1b 5b 3f 34 37 6c 1b       |.[4l.[20l.[?47l.|
000010  5b 3f 37 68 1b 5b 3f 35  6c 1b 5b 3f 32 35 68 1b       |[?7h.[?5l.[?25h.|
000020  5b 48 1b 5b 39 39 39 39  42 1b 5b 36 6e                |[H.[9999B.[6n   |

                                ---=== WRITE ===---
000000  1b 5b 35 37 3b 31 52                                   |.[57;1R         |

                                ---=== READ ===---
000000  1b 5b 48 1b 5b 39 39 39  39 42 1b 44 1b 5b 39 39       |.[H.[9999B.D.[99|
000010  39 39 41 1b 5b 36 6e                                   |99A.[6n         |

                                ---=== WRITE ===---
000000  1b 5b 31 3b 31 52                                      |.[1;1R          |

                                ---=== READ ===---
000000  1b 5b 48 1b 5b 39 39 39  39 43 1b 5b 36 6e             |.[H.[9999C.[6n  |

                                ---=== WRITE ===---
000000  1b 5b 31 3b 31 34 31 52                                |.[1;141R        |

                                ---=== READ ===---
000000  1b 5b 48 c4 9b 48 1b 5b  36 6e 0d 20 20 20             |.[H..H.[6n.     |

                                ---=== WRITE ===---
000000  1b 5b 31 3b 33 52                                      |.[1;3R          |

                                ---=== READ ===---
000000  1b 5b 48 1b 5b 39 39 39  39 43 1b 5b 36 6e 20 1b       |.[H.[9999C.[6n .|

                                ---=== WRITE ===---
000000  1b 5b 31 3b 31 34 31 52                                |.[1;141R        |

                                ---=== READ ===---
000000  5b 36 6e 20 1b 5b 36 6e                                |[6n .[6n        |

                                ---=== WRITE ===---
000000  1b 5b 31 3b 31 34 32 52  1b 5b 32 3b 32 52             |.[1;142R.[2;2R  |

                                ---=== READ ===---
000000  1b 5b 33 3b 35 72 1b 5b  48 1b 5b 36 6e 0a 0a          |.[3;5r.[H.[6n.. |
                               ---=== WRITE ===---
000000  1b 5b 31 3b 31 52                                      |.[1;1R          |

                                ---=== READ ===---
000000  0a 0a 0a 0a 0a 1b 5b 36  6e 1b 5b                      |......[6n.[     |

                                ---=== WRITE ===---
000000  1b 5b 35 3b 31 52                                      |.[5;1R          |

                                ---=== READ ===---
000000  39 39 39 39 42 1b 5b 36  6e 1b 5b 72                   |9999B.[6n.[r    |

                                ---=== WRITE ===---
000000  1b 5b 35 3b 31 52                                      |.[5;1R          |

                                ---=== READ ===---
000000  1b 5b 31 3b 39 39 39 39  72 0d 0d 0d 1b 5b 39 39       |.[1;9999r....[99|
000010  39 39 42 5b 61 64 6d 69  6e 40 73 77 69 74 63 68       |99B[admin@switch|
000020  5d 20 3e 20                                            |] >             |
这一系列转义序列到底在做什么,在我的客户机中处理这个问题的最佳方法是什么

from asyncio import Protocol, get_event_loop
from serial.aio import create_serial_connection

class Serial(Protocol):

   def connection_made(self, transport):
       self.transport = transport

   def data_received(self, data):
       self.buffer += data.decode("utf-8")
       self.handle()

   def send(self, line):
       self.transport.write("{}\r\n".format(line).encode())

loop = get_event_loop()
coro = create_serial_connection(loop, Serial, "/dev/ttyUSB0")
loop.run_until_complete(coro)
loop.run_forever()

带有
[6n
的区块(以及它前面的转义字符)要求终端告诉它光标在哪里,作为确定屏幕大小的一部分。显然
pyserial
不理解这一点,您必须等待一段时间,等待执行请求的程序放弃并继续

在:

其中,CSI是控制序列启动器转义
[

当您运行
屏幕
时,它会显示此控制序列(即,它会正确地读取、理解和回复):

0x9b
0x1b
0x5b
或escape
[
的8位等效项)

因此,您的选择很少:

  • 消除(可能不必要的)屏幕大小查询,或
  • 修改pyserial脚本以处理设备状态控制序列

可能值得尝试告诉另一方的设备,本地客户端不理解这些转义序列,因此设备不会发送它们。也许有办法配置终端类型或术语环境变量?另一方很可能现在就需要xterm或vt100或类似的终端。是的,它是p告诉设备不要发送序列是可能的,但是我有兴趣了解更多关于这个过程的信息。好吧,如果你能以某种方式检测到转义序列并发送一个合适的答案,这可能也会起作用,并且可能会解决暂停问题。相关标准是。对,但我不想随意重播我用strace捕获的esc代码。我认为我可以在这里使用许多库。对我来说,这听起来很难以一种健壮而全面的方式为库做到,因为它基本上是终端模拟(处理转义代码)和基于行的请求响应的混合体(我相信这就是你想要做的,除非我误解了)。当然,这并不意味着它不存在。这只是我的直觉。
CSI Ps n  Device Status Report (DSR).
...
            Ps = 6  -> Report Cursor Position (CPR) [row;column].
case 'n': if (a1 == 5) /* Report terminal status */ Report(win, "\033[0n", 0, 0); else if (a1 == 6) /* Report cursor position */ Report(win, "\033[%d;%dR", win->w_y + 1, win->w_x + 1);
1b 5b 48 c4 9b 48