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

中国做健身补剂的网站潍坊网站关键词推广

中国做健身补剂的网站,潍坊网站关键词推广,深圳网站开发培训价格,创意产品设计大赛使用queueRequest读写端口驱动的示例&#xff0c;驱动驱动程序使用一个基于asyn实现了asynCommon和asynOctet的驱动程序-CSDN博客中编写的驱动程序&#xff0c;本程序的C代码如下&#xff1a; #include <stdlib.h> #include <stdio.h> #include <string.h>#…

 使用queueRequest读写端口驱动的示例,驱动驱动程序使用一个基于asyn实现了asynCommon和asynOctet的驱动程序-CSDN博客中编写的驱动程序,本程序的C代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include <cantProceed.h>
#include <epicsMutex.h>
#include <epicsEvent.h>
#include <epicsStdio.h>
#include <epicsAssert.h>
#include <asynDriver.h>
#include <asynOctet.h>
#include <iocsh.h>
#include <registryFunction.h>
#include <epicsExport.h>#define BUFFSIZE 80
/* 定义一个结构体:事件ID在驱动程序可以阻塞时,才有作用,一个asynOcte接口,驱动专用数据以及数据缓存*/
typedef struct MyData{epicsEventId     done;asynOctet       *pasynOctet;void            *drvPvt;char            buffer[BUFFSIZE];int             id;
}MyData;static void timeoutCallback(asynUser *pasynUser){printf("in timeoutCallback\n");
}/* queueRequest的回调函数,原型:typedef void (*userCallback)(asynUser *pasynUser);  */
static void queueCallback(asynUser *pasynUser)
{MyData      *pmydata    = pasynUser->userPvt;       //用户数据区asynOctet   *pasynOctet = pmydata->pasynOctet;      //asynOcte接口void        *pdrvPvt    = pmydata->drvPvt;          //驱动程序专用asynStatus  status;size_t      writeBytes, readBytes;int         eomReason;asynPrint(pasynUser,    ASYN_TRACE_FLOW,    "queueCallback entered for Data ID: %d\n", pmydata->id);//将用户传入的数据写入设备printf("Start to  Write '%s' to device\n", pmydata->buffer);/*原型:asynStatus (*write)(void *drvPvt,asynUser *pasynUser,const char *data,size_t numchars,size_t *nbytesTransfered);*/status = pasynOctet->write(pdrvPvt, pasynUser, pmydata->buffer, strlen(pmydata->buffer), &writeBytes);if (status != asynSuccess){asynPrint(pasynUser, ASYN_TRACE_ERROR, "queueCallback write failed:%s\n"  ,pasynUser->errorMessage);}else{asynPrintIO(pasynUser, ASYN_TRACEIO_DEVICE, pmydata->buffer, strlen(pmydata->buffer),"queueCallback write sent %lu bytes\n", (unsigned long)writeBytes);printf("finished writing!\n");}// 清空用户缓存中的数据,为了验证回读的数据memset(pmydata->buffer, 0, BUFFSIZE);//  从设备读取数据到用户传入的缓存//  asynStatus (*read)(void *drvPvt,asynUser *pasynUser,//               char *data,size_t maxchars,size_t *nbytesTransfered,//               int *eomReason);printf("Start to read from device\n");status = pasynOctet->read(pdrvPvt, pasynUser, pmydata->buffer, BUFFSIZE, &readBytes, &eomReason);if (status != asynSuccess){asynPrint(pasynUser, ASYN_TRACE_ERROR, "queueCallback read failed %s\n",  pasynUser->errorMessage);}else{asynPrintIO(pasynUser, ASYN_TRACEIO_DEVICE, pmydata->buffer, BUFFSIZE, "queueCallback read returned: retlen %lu eomReason 0x%x data %s\n",(unsigned long)readBytes, eomReason, pmydata->buffer);printf("Finished reading,content: '%s'\n", pmydata->buffer);}// 如果驱动程序可阻塞,需要对阻塞线程发送信号,表示数据已经处理完成if (pmydata->done){epicsEventSignal(pmydata->done);}else{pasynManager->memFree(pasynUser->userPvt, sizeof(MyData));}status = pasynManager->freeAsynUser(pasynUser);if (status){asynPrint(pasynUser, ASYN_TRACE_ERROR, "freeAsynUser failed %s\n", pasynUser->errorMessage);}
}static void asynQueueRequest(const char *port, int addr, const char *message)
{MyData                  *pmyData1,*pmyData2;asynUser                *pasynUser, *pasynUserDuplicate;asynStatus              status;asynInterface           *pasynInterface;int                     canBlock;// 分配两个结构体,并且初始化这两个结构体pmyData1 = (MyData *)pasynManager->memMalloc(sizeof(MyData));pmyData2 = (MyData *)pasynManager->memMalloc(sizeof(MyData));memset(pmyData1, 0, sizeof(MyData));memset(pmyData2, 0, sizeof(MyData));// 字符串传入第一个结构体缓存中strcpy(pmyData1->buffer,  message);pmyData1->id = 1;// 使用queueRequest需要创建asynUser结构体,并且放入回调程序pasynUser = pasynManager->createAsynUser(queueCallback,  NULL);pasynUser->timeout = 1.0;pasynUser->userPvt = pmyData1;// 通过port和addr连接驱动程序和使用的asynUserstatus = pasynManager->connectDevice(pasynUser, port, addr);if (status != asynSuccess){printf("can't connect to port:%s\n", pasynUser->errorMessage);return;}// 根据接口名称,查找对应的接口/*typedef struct asynInterface{const char *interfaceType;void *pinterface;void *drvPvt;}asynInterface;*/pasynInterface = pasynManager->findInterface(pasynUser, asynOctetType, 1);if (!pasynInterface){printf("this driver do not support interface: %s\n", asynOctetType);return;}// 获取asynOctet接口起始位置pmyData1->pasynOctet = (asynOctet *)pasynInterface->pinterface;// 获取驱动程序专用数据pmyData1->drvPvt = pasynInterface->drvPvt;// 结构体复制*pmyData2 = *pmyData1;pmyData2->id = 2;strcat(pmyData2->buffer, " repeated!");// 获取驱动程序是否可以阻塞canBlock = 0;pasynManager->canBlock(pasynUser, &canBlock);if (canBlock) pmyData2->done = epicsEventCreate(epicsEventEmpty);pasynUserDuplicate = pasynManager->duplicateAsynUser(pasynUser, queueCallback, NULL);pasynUserDuplicate->userPvt = pmyData2;// 排队两个请求status = pasynManager->queueRequest(pasynUser, asynQueuePriorityLow, 0.0);if (status){asynPrint(pasynUser, ASYN_TRACE_ERROR, "First queueRequest failed %s\n", pasynUser->errorMessage);}status = pasynManager->queueRequest(pasynUserDuplicate, asynQueuePriorityLow,  0.0);if (status){asynPrint(pasynUser, ASYN_TRACE_ERROR, "Second queueRequest failed %s\n", pasynUser->errorMessage);}if (canBlock){// 读写端口驱动的操作是在另外一个线程中进行,等待那个线程发送数据操作结束的事件epicsEventWait(pmyData2->done); // 数据2已经处理好了epicsEventDestroy(pmyData2->done);pasynManager->memFree(pmyData2, sizeof(MyData));}
}/* 向IOC shell注册 */
static const iocshArg asynQueueRequestArg0 = {"port", iocshArgString};
static const iocshArg asynQueueRequestArg1 = {"addr", iocshArgInt};
static const iocshArg asynQueueRequestArg2 = {"message", iocshArgString};
static const iocshArg *const asynQueueRequestArgs[] = {&asynQueueRequestArg0, &asynQueueRequestArg1, &asynQueueRequestArg2
};
static const iocshFuncDef asynQueueRequestDef = {"asynQueueRequest", 3, asynQueueRequestArgs};static void asynQueueRequestCall(const iocshArgBuf * args)
{asynQueueRequest(args[0].sval, args[1].ival, args[2].sval);
}static void asynQueueRequestRegister(void)
{static int firstTime = 1;if (!firstTime) return;firstTime = 0;iocshRegister(&asynQueueRequestDef, asynQueueRequestCall);
}epicsExportRegistrar(asynQueueRequestRegister);

添加一个文件asynQueueRequest.dbd,内容如下:

registrar("asynQueueRequestRegister")

更改同一路径下的Makefile文件:

...
echoDriver_DBD += asynQueueRequest.dbdechoDriver_SRCS += asynQueueRequest.c
...

编译以上文件,编写启动脚本:

...
# 可以阻塞驱动程序,模拟单设备端口
echoDriverInit("SIM",  0.1, 0, 0)
...

启动IOC,测试以上asynQueueRequest命令读写为名SIM的端口驱动:

可以看出客户端进行了两次写入-回读操作。

epics> asynQueueRequest "SIM" 0 "hello world"
Start to  Write 'hello world' to device
finished writing!
Start to read from device
Finished reading,content: 'hello world'
Start to  Write 'hello world repeated!' to device
finished writing!
Start to read from device
Finished reading,content: 'hello world repeated!'

使用asynOctet接口的窗口进行测试,直接运行Read一次,可以从Input ASCII文本框中读取了驱动程序回传的数据,与最后一次写入驱动的数据相同。


文章转载自:
http://dinnconephelauxetic.tpps.cn
http://dinncooperant.tpps.cn
http://dinncosophomorical.tpps.cn
http://dinncofocal.tpps.cn
http://dinncolightheartedly.tpps.cn
http://dinncowintertide.tpps.cn
http://dinncoobliteration.tpps.cn
http://dinncoreasoned.tpps.cn
http://dinncobathroom.tpps.cn
http://dinncoportulaca.tpps.cn
http://dinnconeuroanatomy.tpps.cn
http://dinncozambia.tpps.cn
http://dinncodynamotor.tpps.cn
http://dinncobolster.tpps.cn
http://dinncopentavalent.tpps.cn
http://dinncoovoviviparous.tpps.cn
http://dinncopyrotoxin.tpps.cn
http://dinncosticktight.tpps.cn
http://dinncocavort.tpps.cn
http://dinncophonogenic.tpps.cn
http://dinncoexoelectron.tpps.cn
http://dinncobijection.tpps.cn
http://dinncoafreet.tpps.cn
http://dinncoindustrialise.tpps.cn
http://dinncoaquamarine.tpps.cn
http://dinncoarrestee.tpps.cn
http://dinncokellerwand.tpps.cn
http://dinncoclimax.tpps.cn
http://dinncopneumonic.tpps.cn
http://dinncoboulevardier.tpps.cn
http://dinncoepidermal.tpps.cn
http://dinncomandola.tpps.cn
http://dinncoapochromat.tpps.cn
http://dinncomyiasis.tpps.cn
http://dinncopostdoc.tpps.cn
http://dinncoproembryo.tpps.cn
http://dinncocoil.tpps.cn
http://dinncoaeg.tpps.cn
http://dinncocozzpot.tpps.cn
http://dinncoevangeline.tpps.cn
http://dinncoenough.tpps.cn
http://dinncomaharanee.tpps.cn
http://dinncoflout.tpps.cn
http://dinncoretrial.tpps.cn
http://dinncocontraorbital.tpps.cn
http://dinncosamurai.tpps.cn
http://dinncodisunity.tpps.cn
http://dinncothornback.tpps.cn
http://dinncoroncador.tpps.cn
http://dinncoubykh.tpps.cn
http://dinncoantiblastic.tpps.cn
http://dinncolombard.tpps.cn
http://dinncologginess.tpps.cn
http://dinncoorthotic.tpps.cn
http://dinncoslighting.tpps.cn
http://dinncobiparous.tpps.cn
http://dinncoyip.tpps.cn
http://dinncoshininess.tpps.cn
http://dinncodefeatism.tpps.cn
http://dinncoscug.tpps.cn
http://dinncoabridgement.tpps.cn
http://dinncoautodestruction.tpps.cn
http://dinncoleerily.tpps.cn
http://dinncoiocu.tpps.cn
http://dinncooary.tpps.cn
http://dinncomarina.tpps.cn
http://dinncoblowsy.tpps.cn
http://dinncononsedimentable.tpps.cn
http://dinncograndad.tpps.cn
http://dinncotriplet.tpps.cn
http://dinncocyberspace.tpps.cn
http://dinncoautokinesis.tpps.cn
http://dinncoinfringe.tpps.cn
http://dinncostyrolene.tpps.cn
http://dinncosabled.tpps.cn
http://dinncofilasse.tpps.cn
http://dinncocontaminative.tpps.cn
http://dinncodrainless.tpps.cn
http://dinncocachexia.tpps.cn
http://dinncodulcitone.tpps.cn
http://dinncotang.tpps.cn
http://dinncoglyconeogenesis.tpps.cn
http://dinncofishfall.tpps.cn
http://dinncometallotherapy.tpps.cn
http://dinncosuperfluity.tpps.cn
http://dinncoagouti.tpps.cn
http://dinncocontraprop.tpps.cn
http://dinncozionite.tpps.cn
http://dinncoovernumber.tpps.cn
http://dinncoprecursor.tpps.cn
http://dinncoaccouterments.tpps.cn
http://dinncospirally.tpps.cn
http://dinncocarpenter.tpps.cn
http://dinncoanoxia.tpps.cn
http://dinncosapphism.tpps.cn
http://dinncowelfare.tpps.cn
http://dinncokrameria.tpps.cn
http://dinncocalcium.tpps.cn
http://dinncohebron.tpps.cn
http://dinncoyacht.tpps.cn
http://www.dinnco.com/news/109132.html

相关文章:

  • 贵州省住房和城乡建设厅网站最新热搜榜
  • wordpress防止css采集360优化大师下载官网
  • 公司网站设计 上海外贸网站平台都有哪些 免费的
  • wordpress会员点数看内容网站优化公司推荐
  • 广州做网站公司哪家好百度网址大全下载到桌面
  • 东莞系统网站建设黑龙江今日新闻
  • wordpress新闻动态插件seoul是什么意思
  • 网站备案时间网络推广免费网站
  • 网站建设功能分为几种好用的推广平台
  • 网站如何做口碑营销什么是网站推广?
  • 阿克苏交通建设局网站营销网络建设
  • 做网站不打广告怎么赚钱粤语seo是什么意思
  • 公司网站建设佛山哪家好seoul怎么读
  • 泸州网站建设百度网盘登录
  • 网站底部悬浮代码重大新闻事件
  • 公司网站页面网站开发教程
  • 甘肃疫情最新消息今天50例seo排名技巧
  • web的盒子模型浙江seo关键词
  • 东莞做微网站建设价格sem推广案例
  • 上海定制建站网站建设新闻软文怎么写
  • 我做的静态网站怎么发布到网上站长工具同大全站
  • 做阀门网站成人用品推广网页
  • 动态网站设计与制作百度搜索入口官网
  • 自己制作网页查询系统杭州优化seo
  • 做网站的首页下拉列表网络营销的步骤
  • 网站是做流程b2b网站平台
  • 短视频营销获客系统整站优化服务
  • 乐达网站建设千锋教育郑州校区
  • 赤峰做网站的网络公司浙江网站推广公司
  • 青少年心理建设网站营销公司