并发无关串行API
serialio的Python项目详细描述
串行
一个python并发无关的串行线库。在
在处理通过串行线路和 简单的REQ-REP通信协议(示例: SCPI)。在
除了本地串行线,serialio还支持RFC2217协议上的串行线, 原始TCP套接字和tango。在
就RFC2217而言,它应兼容:
- 具有telnet(RFC2217)和原始配置的ser2net网桥
- G系列[ser2tcp]桥(RFC2217)
就探戈而言,它应该与探戈类兼容:
使用asyncio编写的基本实现,支持不同的并发模型:
- 异步
- 经典阻塞API(TODO)
- 基于未来的API(TODO)
下面是对什么是forseen和实现什么的总结
Concurrency | Local | RFC2217 | Raw TCP | Tango |
---|---|---|---|---|
asyncio | Y | Y | Y | Y |
classic sync | N | N | N | N |
conc. futures | N | N | N | N |
安装
在您最喜欢的python环境中:
pip install serialio
使用
异步
^{pr2}$local serial line
importserialio.aio.posixsl=serialio.aio.posix.Serial("/dev/ttyS0")# or the equivalentsl=serialio.serial_for_url("serial:///dev/ttyS0")
raw TCP套接字
importserialio.aio.tcpsl=serialio.aio.tcp.Serial("lab1.acme.org:5000")# or the equivalentsl=serialio.serial_for_url("serial-tcp://lab1.acme.org:5000")
RFC2217(telnet)
importserialio.aio.rfc2217sl=serialio.aio.rfc2217.Serial("lab1.acme.org:5000")# or the equivalentsl=serialio.serial_for_url("rfc2217://lab1.acme.org:5000")
Tango
(需要pip install serialio[tango]
安装)
importserialio.aio.tangosl=serialio.aio.tango.Serial("lab/01/serial-01")# or the equivalentsl=serialio.serial_for_url("tango://lab/01/serial-01")
经典(TODO)
fromserialio.aio.tcpimportSerialsl=Serial("lab1.acme.org",5000)reply=sl.write_readline(b"*IDN?\n")print(reply)
在同期期货(待办事项)
fromserialio.sio.tcpimportSerialsl=Serial("lab1.acme.org",5000,resolve_futures=False)reply=sl.write_readline(b"*IDN?\n").result()print(reply)
与serial的API差异
- 基于协程的API
open()
在使用串行线之前,必须显式地调用协同例程- 通过函数而不是属性(即:
await ser_line.set_XXX(value)
而不是{} (例如: await ser_line.set_baudrate()
) - 自定义
eol
字符(serial固定为b"\n"
) - 包含的REQ/REP原子函数(
write_read()
系列)
特点
串行串行对象的主要目标是促进通信 把仪器连接到串行线路上。在
最常见的情况包括需要REQ/REP的仪器 语义与ASCII协议,如SCPI。在这些情况下,大多数命令 在主机和 仪器。在
REQ-REP语义
很多仪器都有请求-应答协议。连载
提供帮助完整的write_read
族方法,简化通信
用这些仪器。在
自定义下线
在基于行的协议中,有时人们会认为\n
不是一个好的下线字符。
可以使用不同的下线字符自定义serialio。
例如,XIA-PFCU总是
答复为;\r\n
,因此我们可以使用以下代码段对其进行配置:
sl=serialio.serial_for_url("serial:///dev/ttyS0",eol=b";\r\n")awaitsl.open()
初始EOL字符可以在任何readline
方法中被覆盖。
示例:
awaitsl.write_readline(b"*IDN?\n",eol=b"\r")
流
TODO:写这一章
- 项目
标签: