这个应用程序可以用于测试连接管理。它用drvAsynIPPort连接一个设备并且在一个后台线程中周期地写入此设备。取决于是否连接了设备,将打印出错消息。可以通过循环上电或者断开网线连接或断开这个设备来测试这种行为。

以下是建立并且测试这个程序的完整过程:

1) 建立IOC应用程序框架

[blctrl@main-machine exer]$ mkdir exer41
[blctrl@main-machine exer]$ cd exer41
[blctrl@main-machine exer41]$ makeBaseApp.pl -t ioc testAsynDriver
[blctrl@main-machine exer41]$ makeBaseApp.pl -i -t ioc testAsynDriver
Using target architecture linux-x86_64 (only one available)
The following applications are available:testAsynDriver
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
[blctrl@main-machine exer41]$ ls
configure  iocBoot  Makefile  testAsynDriverApp

2) 编辑configure/RELEASE目录,添加以下内容:

SUPPORT=/usr/local/EPICS/synApps/support
ASYN=$(SUPPORT)/asyn
IPAC=$(SUPPORT)/ipac

3) 进入testAsynDriverApp/src目录中,创建一个名testConnect.cpp为的c++源文件:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>#include <epicsThread.h>
#include <epicsString.h>
#include <iocsh.h>
#include <asynPortDriver.h>
#include <asynOctetSyncIO.h>#include <epicsExport.h>class testConnect :  public asynPortDriver {
public:// 构造函数testConnect(const char * portName, const char * IPPortName, const char * outputString);void pollerTask(void);
private:asynUser * pasynUserIPPort_;const char * outputString_;
};static const char * driverName = "testConnect";// 定义程序轮询时间
#define POLLER_PERIOD 1
// 定义响应的最大长度
#define MAX_RESPONSE_LEN 256//定义静态函数,只能被从这个文件中调用
static void pollerTask(void * drvPvt);testConnect::testConnect(const char * portName, const char * IPPortName, const char * outputString): asynPortDriver(portName,1, /*maxAddr*/asynOctetMask, /*接口掩码*/0, /*中断掩码*/ASYN_CANBLOCK, /*asynFlag.这个驱动程序阻塞,并且它不是多设备*/1,/*自动连接*/0,/*默认优先级y*/0)/*默认栈大小*/
{asynStatus status;const char * functionName = "testConnect";// 开辟空间,存储传入字符串outputString_ = epicsStrDup(outputString);/**              asynStatus (*connect)(const char *port, int addr,*                     asynUser **ppasynUser, const char *drvInfo);*              传入端口名称,传出一个asynUser指针*      */status = pasynOctetSyncIO->connect(IPPortName, 0, &pasynUserIPPort_,NULL);if (status) //连接失败{printf("%s:%s: pasynOctetSyncIO->connect failure, status=%d\n", driverName, functionName, status);return;}/*  创建在后台运行的线程 */status = (asynStatus)(epicsThreadCreate("testConnectTask",epicsThreadPriorityMedium,epicsThreadGetStackSize(epicsThreadStackMedium),(EPICSTHREADFUNC)::pollerTask,this) == NULL);if (status){printf("%s:%s: epicsThreadCreate failed, status=%d\n", driverName, functionName, status);return;}printf("Start new Thread testConnectTask successfully!\n\n");
}static void pollerTask(void * drvPvt)
{testConnect * pPvt = (testConnect *)drvPvt;pPvt->pollerTask();
}/*  轮询任务作为一个单独线程运行 */
void testConnect::pollerTask(void)
{asynStatus status;char response[MAX_RESPONSE_LEN] = "";size_t numWrite, numRead;int isConnected;int eomReason;static const char * functionName = "pollerTask";/* 一直循环 */while(1){// 父类的公有成员函数lock();/* 根据端口或设备是否连接,isConnect被设置0或1 */status = pasynManager->isConnected(pasynUserIPPort_, &isConnected);if (status){//父类的保护成员变量asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,"%s:%s: error calling pasyManager->isConnected, status=%d, error=%s\n",driverName, functionName, status, pasynUserIPPort_->errorMessage);}asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER,"%s:%s: isConnected = %d\n", driverName, functionName, isConnected);/**                      asynStatus (*writeRead)(asynUser *pasynUser, const char *write_buffer, size_t write_buffer_len,*              char *read_buffer, size_t read_buffer_len,  double timeout,size_t *nbytesOut, size_t *nbytesIn, int *eomReason);*              */status = pasynOctetSyncIO->writeRead(pasynUserIPPort_, outputString_, strlen(outputString_),response, sizeof(response),1.0, &numWrite, &numRead, &eomReason);if (status){asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,"%s:%s: error calling pasynOctetSyncIO->writeRead,status=%d, error=%s\n",driverName, functionName, status, pasynUserIPPort_->errorMessage);}else{printf("From Server: %s\n", response);asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER,"%s:%s: numWrite=%ld, wrote:%s, numRead=%ld, response=%s\n",driverName, functionName, (long)numWrite,outputString_,(long)numRead, response);}unlock();epicsThreadSleep(POLLER_PERIOD);}
}extern "C" {
int testConnectConfigure(const char * portName, const char * IPPortName, const char * outputString)
{new testConnect(portName, IPPortName, outputString);return(asynSuccess);
}/*  EPICS iocsh shell command */
static const iocshArg initArg0 = {"portName", iocshArgString};
static const iocshArg initArg1 = {"IPPortName", iocshArgString};
static const iocshArg initArg2 = {"output string", iocshArgString};
static const iocshArg * const initArgs[] = {&initArg0, &initArg1, &initArg2};
static const iocshFuncDef initFuncDef = {"testConnectConfigure",3, initArgs};static void initCallFunc(const iocshArgBuf * args)
{testConnectConfigure(args[0].sval,args[1].sval, args[2].sval);
}void testConnectRegister(void)
{iocshRegister(&initFuncDef, initCallFunc);
}epicsExportRegistrar(testConnectRegister);
}

4) 在与第(3)步相同路径下,创建一个名为testConnectSupport.dbd的文件,在此文件中添加以下一行:

registrar("testConnectRegister")

5) 编译 在第(3)步相同路径下的Makefile文件,内容如下:

TOP=../..include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================
LIBRARY_IOC += testAsynDriverSupport# Compile and add code to the support library
LIB_SRCS += testConnect.cpp
LIB_LIBS += asyn
LIB_LIBS += $(EPICS_BASE_IOC_LIBS)#
#=============================
# Build the IOC applicationPROD_IOC = testAsynDriver
# testAsynDriver.dbd will be created and installed
DBD += testAsynDriver.dbd# testAsynDriver.dbd will be made up from these files:
testAsynDriver_DBD += base.dbd
testAsynDriver_DBD += testConnectSupport.dbd# Include dbd files from all support applications:
testAsynDriver_DBD += asyn.dbd
testAsynDriver_DBD += drvAsynIPPort.dbd
testAsynDriver_DBD += testConnectSupport.dbd# Add all the support libraries needed by this IOC
testAsynDriver_LIBS += asyn
testAsynDriver_LIBS += testAsynDriverSupport# testAsynDriver_registerRecordDeviceDriver.cpp derives from testAsynDriver.dbd
testAsynDriver_SRCS += testAsynDriver_registerRecordDeviceDriver.cpp# Build the main IOC entry point on workstation OSs.
testAsynDriver_SRCS_DEFAULT += testAsynDriverMain.cpp
testAsynDriver_SRCS_vxWorks += -nil-# Add support from base/src/vxWorks if needed
#testAsynDriver_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary# Finally link to the EPICS Base libraries
testAsynDriver_LIBS += $(EPICS_BASE_IOC_LIBS)#===========================include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE

6) 切换倒这个IOC的顶层目录中执行make进行编译。

7)切换到iocBoot/ioctestAsynDriver/目录下,编辑启动文件st.cmd,内容如下:

#!../../bin/linux-x86_64/testAsynDriver#- You may have to change testAsynDriver to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/testAsynDriver.dbd"
testAsynDriver_registerRecordDeviceDriver pdbbase## Load record instances
#dbLoadRecords("db/xxx.db","user=blctrl")
drvAsynIPPortConfigure("IPPort", "127.0.0.1:6666", 0, 0, 1);
testConnectConfigure("PORT1", "IPPort", "Hello EPICS ")cd "${TOP}/iocBoot/${IOC}"
iocInit

8) 用python编写一个服务器程序server.py,对以上IOC程序进行测试:

#!/usr/bin/python3import socketserverIP = "127.0.0.1"
serverPort = 6666class Tcp_Server(object):def __init__(self, ip, port):self.server_ip = ipself.server_port = portself.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server.bind((self.server_ip, self.server_port))self.server.listen(10)while True:while True:sock, ip_port = self.server.accept()if sock is not None:print('New Client: %s' % str(ip_port))breakwhile True:print("start receive!")data = sock.recv(1024)print("Client: %s" % data)sock.send(data)if len(data) == 0:sock.close()breakdef server_close(self):self.server.close()def main():Tcp_Server(serverIP, serverPort)if __name__ == "__main__":main()

9) 启动服务程序和IOC应用程序:

IOC应用程序终端:

[blctrl@main-machine ioctestAsynDriver]$ ../../bin/linux-x86_64/testAsynDriver st.cmd
#!../../bin/linux-x86_64/testAsynDriver
< envPaths
epicsEnvSet("IOC","ioctestAsynDriver")
epicsEnvSet("TOP","/home/blctrl/exer/exer41")
epicsEnvSet("SUPPORT","/usr/local/EPICS/synApps/support")
epicsEnvSet("ASYN","/usr/local/EPICS/synApps/support/asyn")
epicsEnvSet("IPAC","/usr/local/EPICS/synApps/support/ipac")
epicsEnvSet("EPICS_BASE","/usr/local/EPICS/base")
cd "/home/blctrl/exer/exer41"
## Register all support components
dbLoadDatabase "dbd/testAsynDriver.dbd"
testAsynDriver_registerRecordDeviceDriver pdbbase
## Load record instances
#dbLoadRecords("db/xxx.db","user=blctrl")
drvAsynIPPortConfigure("IPPort", "127.0.0.1:6666", 0, 0, 1);
testConnectConfigure("PORT1", "IPPort", "Hello EPICS")
cd "/home/blctrl/exer/exer41/iocBoot/ioctestAsynDriver"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.3.1
## EPICS Base built Sep  8 2022
############################################################################
From Server: Hello EPICS
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=blctrl"
epics> From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS
From Server: Hello EPICS

服务程序的终端:

[blctrl@main-machine python_server]$ ./server.py
New Client: ('127.0.0.1', 50312)
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'
start receive!
Client: b'Hello EPICS'

EPICS -- 测试asynDriver和设备支持的示例1-- 连接测试相关推荐

  1. junit链接mysql_java – 使用JUnit进行简单的JDBC连接测试

    我想简单测试JDBC连接,我不使用框架,只使用JDBC和JUnit.我可以用JUnit执行此测试吗?我不知道如何测试加载驱动程序,请给我一些连接测试的例子. 连接客户端: package newpac ...

  2. EPICS设备支持的简单示例

    描述 这是一个非常简单的设备支持示例.这个EPICS设备支持提供了实时时钟的"秒"部分(00-59).EPICS记录数据库提供了两个记录,"秒"值的十分之一和& ...

  3. Xcode8支持iOS11或者是Xcode9支持iOS11.1的设备支持文件(免费)

    更新一下Xcode9支持iOS12 的设备支持文件 GitHub下载地址: https://github.com/iGhibli/iOS-DeviceSupport 先把设备支持文件的下载地址贴出来: ...

  4. 网易开源支持图像识别的自动化UI测试工具,零基础亲测好评!

    编辑 | Jane 出品 | AI科技大本营 AI科技大本营给大家推荐了很多有意思.适合开发者们的工具,比如代码修复神器.帮小白快速分析 Error.PDF 翻译工具.变量命名神器等等. 今天,营长要 ...

  5. 支持多编程语言的自动测试系统

    源问题地址:http://www.cnblogs.com/xinz/archive/2011/03/20/1989662.html 问题背景 在一座高楼中,我们需要设计一个电梯系统.这个电梯系统中的电 ...

  6. 测带宽的工具_发送端测试的主力设备 - 实时示波器朝向高带宽高位数发展

    高速数字电路仿真设计与测试技术发展趋势综述(三) 示波器作为时域或数字电路信号测量与分析最重要的仪器设备,本质上是作为相对被测信号或系统的接收机在工作,因此其最主要的根本价值在于真实还原或复现被测信号 ...

  7. python 自动获取所有设备信息-使用Python脚本来获取Cisco设备信息的示例

    今天发现一个使用python写的管理cisco设备的小框架tratto,可以用来批量执行命令. 下载后主要有3个文件: Systems.py 定义了一些不同设备的操作系统及其常见命令. Connect ...

  8. ESX4.1 “USB设备支持”实测

    7月13日VMware全球同步发行了vSphere 4.1,新版本在各方面都有改进,具体可参考vSphere 4.1发行说明:http://www.vmware.com/cn/support/vsph ...

  9. I2C是什么,什么类型设备支持I2C,为什么要使用它?

    我相信互联网搜索引擎可为我提供可靠.快速的答案,因此当我第一次遇到I2C协议时,我首先寻求互联网搜索引擎获得帮助.我的搜索给出如下响应:内部集成电路(I2C)协议是双向双线串行总线,其提供集成电路之间 ...

最新文章

  1. jQuery 插入元素
  2. DPDK报文转发(四)
  3. pickle模块介绍
  4. 【错误记录】Flutter 界面跳转报错 ( Navigator operation requested with a context that does not include a Naviga )
  5. php怎样解析数组,PHP 数组 Array 解析
  6. it计算机知识竞赛主持稿,校园IT知识竞赛策划书
  7. c 语言注释格式化,linux 格式化C语言的源文件 命令:indent
  8. jzoj3339-[NOI2013模拟]wyl8899和法法塔的游戏【博弈论,暴力】
  9. RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接
  10. sql 为什么要用where 1=1或者where 1 =0 ?
  11. influxDB集群模式实践
  12. 基于python的气象数据分析_基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其......
  13. mininet编程实现交换机规则的插入、删除与修改。_Mysql闲聊之从Redo、Undo日志到MVCC实现原理
  14. 经济学金融学书籍推荐
  15. 【离散数学】第二章 命题逻辑的推理理论
  16. [乐意黎原创] 送李愿归盘谷序
  17. 转发: 安全百科 DNS欺骗
  18. qml 文本框获取焦点
  19. 流体动力学—迹线和流线
  20. java任意长度获取随机数

热门文章

  1. 《Windows 8 权威指南》——1.4 易用性
  2. php怎么检测数据类型,PHP检测数据类型的几种方法总结和技巧
  3. HTTPS访问Git远程仓库,上报SSL证书错误解决方法
  4. Tableau 多边形地图、符号地图、定义位置
  5. QML ComboBox 图片加文字
  6. 【Elasticsearch】利用kibana调整索引mapping结构
  7. VR中的9轴传感器(重力加速度/陀螺仪/磁力计)
  8. 城市交通公众号2021年头部内容发布
  9. 基于stm32的MAX31865铂电阻PT100测温全套资料
  10. Android动画之AnimatorSet联合动画用法