1、本地串行端口
drvAsynSerialPort驱动程序支持在IOC上设备连接到串口。
用drvAsynSerialPortConfigure和asynOption命令配置串口。
drvAsynSerialPortConfigure("portName","ttyName",priority,noAutoConnect,noProcessEosIn)
asynSetOption("portName",addr,"key","value")
此处
- portName:向asyn注册的端口名。
- ttyName:本地串口的名称(例如:"/dev/ttyS0", "COM1")
- priority:asyn I/O线程将运行所在的优先级。如果这是0或缺失,则使用epicsThreadPriorityMedium。
- addr:由于用multiDevice=0配置串行设备,忽略这个参数。
- noAutoConnect:0或缺失表示portThread应该自动连接。如果必须发出连接命令,非0。
- noProcessEos:如果0,则指定processEosIn和processEosOut调调用asynInterposeEosConfig。
setEos和getEos方法没有作用并且返回asynError。在至少接受了一个字符前或者在超时发生前,read方法阻塞。read方法传输尽可能多的字符,由指定计数限制。asynInterposeEos可以用于支持EOS。
以下表格概述了drvAsynSerialPort驱动程序asynSetOption键和值。当一个串口连接时,获取当前值。
在一些系统上(例如:Windows Darwin)上,驱动程序接受任何数值用于波特率,这当前必须被系统硬件支持。在Linux上,这些选项被限制于像B300, B9600的值等,在/usr/local/bits/termios.h。
clocal和crtscts参数名是取自POSIX termios串行接口定义 。clocal参数控制是否使用(clocal=N)或忽略(clocal=Y)modem控制线(Data Terminal Ready, Carrier Detect/Received Line Signal Detect)。crtscts参数控制硬件握手线路(请求以发送,清除以发送)被使用(crtscts=Y)或忽略(crtscts=N)。
vxWorks sioLib串行支持不提供对modem控制线路的支持。它也使用clocal用于实际上是crtscts的东西。对于vxWorks,标准串行支持为getOption和setOption接收clocal和crtscts。clocal=Y隐含crtscts=N,并且clocal=N隐含crtscts=Y。
ixon控制XON/OFF对输出流量控制。如果IOC接收了一个XOFF字符,它在接收到一个XON字符钱暂停输出。在通过RFC 2217 Telnet协议进行通信的端口上也支持这个选项。在这种情况中,如在标准所述,ixon隐含了出站和入站流量控制。
ixoff控制XON/OFF对输入流量控制。IOC根据需要发送XOFF和XON字符防止到来的输入快于读取它的程序。发送输入数据的外部设备笔筒通过暂停传输响应一个XOFF字符,以及通过继续传输响应一个XON字符。
ixany标记在输出已经被XOFF字符暂停时允许一个任意输入字符来重新开始输出。否则,仅XON字符重启输出。这个标记不是在所有系统上可用,包括Win32。
仅在内核高于2.6.35的linux上以及支持RS-485的硬件端口上支持rs485选项。延时选项单位是整数毫秒。
需要硬件专用命令设置vxWorks IOC串口。仅在完整这个后,标准的drvAsynSerialPortConfig和asynSetOption命令才能被发出。例如,以下示例展示了一个GreenSprings VIP616-01 carrier的GreenSprings octal URT Industry-Pack模块上一个端口的配置过程。
ipacAddVIPC616_01("0x6000,B0000000")
tyGSOctalDrv(1)
tyGSOctalModuleInit("Mod0","232", 0x80, 0, 0)
tyGSOctalDevCreate("/tyGS/0/0","Mod0",0,0,1000,1000)
drvAsynSerialPortConfigure("/tyGS/0/0","/tyGS/0/0",0,0,0)
asynSetOption("/tyGS/0/0",0,"baud","9600")
For the IP520:
IP520Drv(1)
IP520ModuleInit("UART_0", "232", 0xC2, 0, 0)
IP520DevCreate("A1", "UART_0", 0, 0, 1000, 1000)
drvAsynSerialPortConfigure("A1","A1",0,0,0)
asynSetOption("A1",0,"baud",9600)
asynOctetSetInputEos( "A1",0,"\r")
asynOctetSetOutputEos("A1",0,"\r")
2、TCP/IP或UDP/IP端口
drvAsynIPPort驱动程序支持通过一个TCP/IP或UDP/IP连接进行通信的设备。一个代表性示例是一个通过以太网/串行转换器连接的设备。
用drvAsynIPPortConfigure命令配置TCP/IP或UDP/IP连接:
drvAsynIPPortConfigure("portName", "hostInfo", priority, noAutoConnect, noProcessEos);
此处参数是:
1) portName:向asynManager注册的portName。
2) hostInfo:此设备的Internet主机名,端口号,可选的本地端口号,和可选的IP协议。格式为:
<host>:<port>[:localPort][protocol]
例如:"192.168.1.250:4002", "192.168.1.250:4001:10101", "serials8n3:4002 TCP"或"192.168.1.250:5186 udp"。如果没有指定协议,使用TCP。可能的协议是:
- TCP
- UDP
- UDP*:发送UDP广播。这个参数的地址选项必须是这个网络的广播地址(例如:"192.168.1.2555:1234 UDP*"或"255.255.255.255.:1234 UDP*"等)。
- HTTP:像TCP,但对于服务器,在每次交换后,其关闭连接。
- COM:对于使用TELNET RFC 2217协议的以太网/串行适配器。这允许就像本地串口一样用接着的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应该自动连接。如果必须发出显式的连接命令,非0。
5) noProcessEos:如果0,则调用asynInterposeEosConfig指定processEosIn和processEosOut。
仅实现了asynOctet方法write,read和flush。除非对其它asynOctet方法使用了asynInterposeEos,调用另外的方法将导致一条错误消息。在接收至少一个字符前或者在发生超时前,read阻塞。read传输尽可能多的字符,受到指定计数限制。
以下表格概括了drvAsynIPPort驱动程序asynSetOption键和值。
键 | 值 | 描述 |
disconnectOnReadTimeout | N Y | 默认=N。如果Y,则如果一个read操作超时了,驱动程序自动断开这个IP端口。 |
hostInfo | <host>:<port> [:localPort] [protocol] |
使用与drvAsynIPPortConfigure相同语法IP端口hostInfo格式。这个选项运行在运行时更改asyn port连接的Internet主机和端口。唯一限制是COM(TELNET RFC2217)协议的设置不能从用drvAsynIPPortConfigure指定的被修改。这是因为在drvAsynIPPortConfigure命令中指定了COM,接着使用asynOctet和asynOption interpose接口,而asynManager不支持移除interpose接口。 |
除了键/值对外,如果使用了COM协议,则drvAsynIPPort驱动使用与drvAsynSerialPort驱动相同的键值对来指定串行参数,即:"baud","bits"等。
asynInterposeEos和asynInterposeFlush可以用于提供更多功能。
3、TCP/IP Server
drvAsynIPServerPort驱动通过监听来自远程客户端的TCP/IP或UDP连接支持asyn套接字服务器。在初始化时通过调用drvAsynIPPortConfigure创建maxClients个drvAsynIPPort端口驱动。这些端口被命名为portName:0, portName:1等。此处portName时被传递给drvAsynIPServerPortConfigure的名称。
用drvAsynIPServerPortConfigure命令配置IP服务器监听器:
drvAsynIPServerPortConfigure("portName", "serverInfo", maxClients, priority,
noAutoConnect, noProcessEos);
此处这些参数是:
1) portName:向asynManager注册的portName。
2) serverInfo:在其上监听连接的Internet主机名和端口号。(例如:对于TCP"localhost:4002",对于UDP)。
3) maxClients:能够同时连接到这个端口的IP客户端最大数目。更多的连接请求将出错。
4) priority:它创建的监听线程和任何asyn I/O端口将运行在这个优先级。如果这是0或者缺失,则使用epicsThreadPriorityMedium。
5) noAutoConnect:0或缺失表示监听端口应该自动连接。如果必须发出显式连接命令,非0。注意:监听线程创建的所有asyn I/O端口将被用noAutoConnect=1创建,但这对套接字应用程序是透明的,因为监听线程为它们进行显示连接。
6) noProcessEos:在创建新的asyn I/O端口时,noProcessEos被传递drvAsynIPPortConfigure。如果0,则指定processEosIn和processEosOut调用asynInterfaceEosConfig。
这个驱动程序实现了asynOctet接口。对于TCP连接,它仅支持的方法是registerInterruptUser和cancelInterruptUser。调用其它asynOctet方法将导致一个错误。对于UDP,它实现了asynOctet->read()。当在drvAsynIPServerPortConfigure中指定端口上接收到一个新连接时,以下发生:
- 将搜索这个监听线程已经创建的drvAsynIPPort的列表来看是否有一个当前因为没有连接的远程IP客户端而断开的drvAsynIPPort。
- 如果有一个断开的端口,则用来自这个新IP连接的文件描述符连接它。
- 如果没有断开的端口,则到来的连接将立即被关闭。
- 新连接的端口的asynTraceMask和asynTraceIOMask被设置成监听线程端口的当前值。这使得在iocsh启用跟踪前,跟踪注册客户端的回调执行的早期阶段成为可能。
- 用新连接端口的名称回调所有注册的asyn客户端(其已经在监听端口的asynOctet接口上调用registerInterruptUser)。
4、Linux-GPIB
编写linux-gpib端口驱动来支持The Linux GPIB Package library。
为了构建这个支持,必须安装Linux GPIB Package。也在configure/RELEASE中,语句:
LINUX_GPIB=NO
必须被更改为:
LINUX_GPIB=YES
配置命令:
GpibBoardDriverConfigure(portName, autoConnect, BoardIndex, timeout, priority)
此处:
- portName:一个指定端口名的ascii串,其将向asynDriver注册。
- noAutoConnect:非0表明portThread应该自动连接。0表示必须发出显式的连接命令。
- boardIndex:包含板卡索引的整数(0表示/dev/gpib0)。它通常是0。这必须与在驱动配置的gpib.conf文件(次编号-板卡索引)中相同。
- timeout:一个I/O操作必须在这个时间(秒为单位)内结束。0表示禁用。这是用于对底层驱动程序每次调用的"一般"超时。对于实际的读/写操作,必须在设备支持中定义超时。
- priority:一个指定端口线程优先级的整数。一个0值将导致一个默认值被分配。
一个示例为:
GpibBoardDriverConfig("L0",1,0,3,0)
注意:
- 支持asynOption接口。传给setPortOption函数的键(十六进制)和值(整数)参数必须是以字符数组表示的合适值。详细见GPIB库文档。
- pgibCmd类型GPIBREADW和GPIBEFASTIW未被测试。
- 用来自Measurement Computing的PC104-GPIB板卡测试了linux-port驱动。