当前位置: 首页 > news >正文

asynDriver-6-端口驱动

本地串口

drvAsynSerialPort驱动支持设备连接到IOC上串口。

drvAsynSerialPortConfigureasynSetOption命令配置串口:

drvAsynSerialPortConfigure("portName","ttyName",priority,noAutoConnect,noProcessEosIn)
asynSetOption("portName",addr,"key","value")

此处参数是:

1、portName:向asynGpib注册的portName。

2、ttyName:本地串口名称(例如,/dev/ttyS0, COM1)

3、priortiy:asyn I/O 线程将运行在那个优先级。如果这是0或则缺失,则使用epicsThreadPriorityMedium。

4、addr:这个参数被忽略,因为用multiDevice=0,配置串行设备。

5、noAutoConnect:0或缺失表明portThread应该自动连接。如果必须发送显式的连接命令,非零。

6、noProcessEos:如果0,则指定processEosIn和processEosOut调用asynInterfaceEosConfig。

setEos和getEos方法没有作用并且返回asynError。读取方法阻塞,直到一个字符已经被接收或者直到发生超时。读取方法传输尽可能多的字符,受到指定计数影响。asynInterposeEos可以用来支持EOS。

以下表格概况了drvAsynSerialPort驱动asynSetOption键和值。当串口连接时,获取当前值。

baud50 75 110 134 150 200 300 600 1200 2400 9600 ...
bits8 7 6 5
paritynone even odd
stop1 2
clocalY N
crtsctsN Y
ixonN Y
ixoffN Y
ixanyN Y
rs485_enableN Y
rs485_rts_on_sendN Y
rs485_rts_after_sendN Y
rs485_delay_rts_before_sendmsec_delay
rs485_delay_rts_after_sendmsec_delay

某些系统(如windows,darwin)上 ,驱动接收任何数值用于波特率,这当然必须由系统硬件支持。在Linux上,这些选项受限于像B300,B9600的值,在/usr/include/bits/termios.h中被定义。

clocal和crtscts参数名称获取自POSIX termios串行接口定义。clocal参数控制控制modem控制线路(数据终端准备,载波探测/接收线路信号探测)是否被使用(clocal=N)或者被忽略(clocal=Y)。crtscts参数控制硬件握手线路(请求发送,清除以发送)是(crtscts=Y)否(crtscts=N)被使用。

ixon控制输出上XON/OFF流量控制。如果IOC接收了一个XOFF字符,它在接收到一个XON字符前,暂停输出。在通过RFC 2217 telnet协议的端口通信上也支持这个选项。在这种情况下,如在标准中所述,ixon隐含了出栈和入栈流控制。

ixoff在输入上控制XON/XOFF流量控制。IOC根据需要发送XOFF和XON防止输入到来快于程序读取它。发送输入数据的外部设备必须通过暂停传输响应XOFF字符,通过继续传输响应XON字符。

ixany字符在输出被XOFF字符暂停时允许任何输入字符重新开始输出,否则,仅XON字符重启输出。这个标记不是在所有系统上可用,包括Win32。

仅在内核高于2.6.35的Linux上和竟在支持RS-485的硬件端口上才支持RS485选项。延时选项单位是整数毫秒。

TCP/IP或UDP/IP端口

drvAsynPort驱动支持通过TCP/IP或UPD/IP连接的设备。一个代表性示例是通过Ethernet/Serial转换器连接的设备。

通过drvAsynIPPortConfigure命令配置的TCP/IP或UDP/IP连接:

drvAsynIPPortConfigure("portName","hostInfo",priority,noAutoConnect,noProcessEos)

此处参数是:

1)portName:用asynManager注册的端口名。

2)hostInfo:设备的网络主机名,端口号,可选本地端口号,以及选项的IP协议。格式是:

<host>:<port>[:localPort][protocol]

(例如:"164.54.9.90:4002", "164.54.9.90:4001:10101", "serials8n3:4002", "serials8n3:4002 TCP" 或 "164.54.17.43:5186 udp")。如果没有指定协议,将使用TCP。可能的协议是

  • TCP
  • UDP
  • UDP*:发送UDP广播。参数的地址部分必须是这个网络的广播地址(例如:"192.168.1.255:1234 UDP*", 或 "255.255.255.255:1234 UDP*")
  • HTTP:类似TCP,但对于服务器,它在每次事务后关闭连接。
  • COM:对于使用TELNET RFC 协议的Ethernet/Serial适配器。这允许就像本地串口一样,用后续的asynSetOption参数设置端口参数(速度,校验等)。默认参数是不带流量控制的9600-8-N-1。

如果hostInfo参数以unix://开头,余下参数被当成一个UNIX-域流套接字的名称。要接收UDP广播,localPort是要监听的端口,例如: drvAsynIPPortConfigure("BD","255.255.255.255:1234:3956 UDP*",0,0,0)。如果端口仅用于接收广播消息,则应该指定UDP端口。如果它也用于发送UDP消息,则UDP*协议必须被指定。在这种情况下,广播将在端口"port"上被发送,并且它监听端口"localPort"上的广播消息。

注意:localPort基本上不用于TCP端口,因为通常本地主机选择一个它绑定到的未使用的本地端口并且传递给服务器。但,有一些不常见的服务器,它仅接收一个特定的本地端口或者本地端口范围,在这种情况中,必须指定localPort。

3)priority:asyn I/O线程将运行所在的优先级。如果这是0或者缺失,则使用epicsThreadPriorityMedium。

4)noAutoConnect:0或缺失,表明portThread应该自动连接。如果必须发出显式连接,非零。

5) noProcess:如果0,则指定了processEosIn和processEosOut调用asynInterposeEosConfig。

仅实现了asynOctet方法write,read和flush。除非asynInterposeEos用于其它asynOctet方法,否则调用其它方法将导致错误。在接收到至少一个字符或者在发生超时前,read阻塞。read传输尽可能多的字符,受到指定计数限制。

以下表格概况了drvAsynIPPort驱动asynSetOption键和值。

描述
disconnectOnReadTimeoutN Y默认=N。如果Y,则如果一个读取操作超时了,驱动自动断开IP断开。
hostInfo

<host>:

<port>

[:localPort]

[protocol]

IP端口hostInfo格式使用与drvAsynIPPortConfigure相同的语法。这个选项运行运行时更改这个asyn端口连接的网络主机和端口。唯一限制是COM协议的设置不能从用drvAsynIPPortConfigure指定的被更改。这是因为如果在drvAsynIPPortConfigure命令中指定了COM,则使用了asynOctet和asynOption interpose接口,并且asynManager不指定删除interpose接口。

如果使用了COM协议,除了这些键/值,drvAsynIPPort驱动使用与drvAsynSerialPort驱动相同的键/值对来指定串行参数,即,"baud",“bits”。

asynInterposeEos和asynInterposeFlush可以用于提供其它功能。

TCP/IP服务器

drvAsynIPServerPort驱动通过监听来自远程客户端的TCP/IP或UDP支持asyn套接字服务器。通过初始化时调用drvAsynIPPortConfigure,创建maxClients drvAsynIPPort端口驱动。这些端口命名portName:0, PortName:1等,此处portName是传递给drvAsynIPServerConfigure的名称。

用drvAsynIPServerPortConfigure命令配置IP服务器监听:

 drvAsynIPServerPortConfigure("portName", "serverInfo", maxClients, priority, noAutoConnect, noProcessEos);

此处参数是:

1)portName:用asynManager注册的端口名。

2)serverInfo:为连接所监听的网络主机名和端口号。(例如:对于TCP "localhost:4002",对于UDP "localhost:4002 UDP")。

3)maxClient:可以同时连接这个端口的IP客户端的最大数目。多出的连接请求将出错。

4)priority:它创建的任何asyn I/O端口和监听线程将运行所在的优先级。如果这是0或者缺失,则使用epicsThreadPriorityMedium。

5)noAutoConnect:0或缺失表明监听端口应该自动连接。如果必须发出显式的连接命令,非零。注意:监听线程将用noAutoConnect=1创建所有asyn I/O端口,但这是对套接字服务程序透明的,因为监听线程为它们进行显式的连接。

6)当创建新的asyn I/O端口时,noProcessEos被传递给了drvAsynIPPortConfigure。如果0,则指定processEosIn和processEosOut,调用asynInterposeEosConfig。

这个驱动实现了asynOctet接口。对于TCP连接,它支持的仅有方法是registerInterruptUser和cancelInterruptUser。调用其它asynOctet方法将导致错误。对于UDP,它实现了asynOctet->read()。当在drvAsynIPServerPortConfigure中指定的端口上接收一个新连接时,以下发生:

  • 这个监听线程已经创建的drvAsynIPPort端口的列表被搜索来查看因为没有远程IP客户端连接,当前有一个没有被连接的drvAsynIPPort。
  • 如果有一个未连接的端口,则用来自新的IP连接的文件描述符连接它。
  • 如果没有未连接的端口,则到来的连接将立即被关闭。
  • 新连接端口的asynTraceMask和asynTraceIOMask被设置成监听线程端口的当前值。这使得在在iocsh可使能跟踪前,使得可能跟踪对注册客户端的回调执行的早期阶段。
  • 用新连接端口的名称回调所有注册的asyn客户端(在监听端口上asynOctet接口上已经调用了registerInterruptUser)。
http://www.lryc.cn/news/476762.html

相关文章:

  • [免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】
  • Python使用爬虫
  • CommunityToolkit.Mvvm如何使用
  • Python小游戏20——超级玛丽
  • 配置文件格式(xml、properties、yml/yaml)
  • CentOS 7 软件/程序安装示例
  • Python绘制正弦函数图形
  • 【LVGL-列表部件 lv_list_create】
  • 【P2-6】ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——UDP数据透传
  • 从零学习大模型(十)-----剪枝基本概念
  • Jest进阶知识:模拟 ES6 类 - 掌握类的依赖模拟与方法监听技巧
  • 前端Nginx的安装与应用
  • Java设计模式(代理模式整理中ing)
  • 第J9周:Inception v3算法实战与解析(pytorch版)
  • 如何封装一个axios,封装axios有哪些好处
  • java的批量update
  • go语言连续监控事件并回调处理
  • 1.探索WebSocket:实时网络的心跳!
  • uniapp学习(010-2 实现抖音小程序上线)
  • 测试和实施面试题收集
  • 【Vue3】一文全览基础语法-案例程序及配图版
  • 【OpenSearch】安装部署OpenSearch和OpenSearch-Dashboard
  • 【系统架构设计师】2023年真题论文: 论软件可靠性评价的设计与实现(包括和素材和论文)
  • 教程:使用 InterBase Express 访问数据库(二)
  • Windows密码的网络认证---基于挑战响应认证的NTLM协议
  • fpga 常量无法改变
  • 【HarmonyOS NEXT】如何给未知类型对象定义类型并使用递归打印所有的Key
  • RuoYi 样例框架运行步骤(测试项目自用,同学可自取)
  • Java进程CPU飙高排查
  • conda的对应环境下安装cuda11.0和对应的cudnn