labview的GPIB数据输入命令怎样一次发几十条

labview的GPIB数据输入命令怎样一次发几十条,第1张

若在windows的Eclipse工程中直接启动mapreduc程序,需要先把hadoop集群的配置目录下的xml都拷贝到src目录下,让程序自动读取集群的地址后去进行分布式运行(您也可以自己写java代码去设置job的configuration属性)。

你可以利用时间结构中的超时事件

时间结构在刚创建的时候,默认的事件就是超时事件,他表示当事件结构结构内的任何事件都没有触发达到设定的时间时,超时事件触发,执行超时事件框内对应的代码。

对于你所要求的定时自动发送命令,设定的间隔时间其实就是超时时间,当然事件结构内也可以添加其他事件,手动发送命令。

超时事件的超时时间的输入端,位于事件结构的左上角的沙漏状的图标处,数据类型是有符号32位整形数,单位毫秒。当超时时间设置为-1时表示从不执行超时事件,一直等待,也可以理解为禁用了超时事件。

值得注意的是当你把事件结构放在while循环中,事件结构会循环执行,那么超时时间设为定值的话超时事件没法停止,使用起来不太方便。可以通过控制超时时间的设定值来作为自动发送的开关。说的稍有复杂,我写了个简单地模板,见附件,你看一看也许就明白了。下面给一个程序的截图。

gpib

通用接口总线(General-Purpose Interface Bus,GPIB)是一种设备和计算机连接的总线。大多数台式仪器是通过GPIB线以及GPIB接口与电脑相连。

GPIB(General-Purpose Interface Bus)-通用接口总线,大多数台式仪器是通过GPIB线以及GPIB接口与电脑相连。

1965年惠普公司设计HP-IB

1975年 HP-IB变成IEEE-488-1975标准

1977年10月表决通过后IEC(国际电工委员会)便颁布了IEC625标准

1987年 IEEE又将原IEEE-488标准作个别修订定名为IEEE-488.1-1987,并同时颁布了IEEE-488.2-1987标准,对器件消息的编码格式作了进一步的标准化

1990年SCPI规范被引入IEEE 488仪器

1992年 修订IEEE 488.2

1993年 NI公司提出HS488

1965年,惠普公司(Hewlett-Packard)设计了惠普接口总线(HP-IB, 用于连接惠普的计算机和可编程仪器.由于其高转换速率(通常可达1Mbytes/s), 这种接口总线得到普遍认可, 并被接收为IEEE标准488-1975和ANSI/IEEE标准488.1-1987. 后来, GPIB比HP-IB的名称用得更广泛. ANSI /IEEE 488.2 -1987加强了原来的标准, 精确定义了控制器和仪器的通讯方式. 可编程仪器的标准命令(Standard Commands for Programmable Instruments,SCPI)采纳了IEEE488.2定义的命令结构,创建了一整套编程命令。

基本特性

(1) 可以用一条总线互相连接若干台装置,以组成一个自动测试系统。 系统中装置的数目最多不超过15台,互连总线的长度不超过20m。

(2) 数据传输采用并行比特(位)、串行字节(位组)双向异步传输方式,其最大传输速率不超过1兆字节每秒。

(3)总线上传输的消息采用负逻辑。低电平(≤+0.8V)为逻辑“1”,高电平(≥+2.0V)为逻辑“0”。

(4) 地址容量。单字节地址:31个讲地址,31个听地址;双字节地址:961个讲地址,961个听地址。

(5) 一般适用于电气干扰轻微的实验室和生产现场。

利用串口进行数据通讯在通讯领域重占有着重要的地位。利用RS232-RS485进行数据信号的采集和传递是VC编程的又一大热点。串口通讯在通讯软件重有着十分广泛的应用。如电话、传真、视频和各种控制等。在各种开发工具中间,VC由于功能强大和灵活,同时也得到了Microsoft的最大支持,所以在一般进行涉及硬件 *** 作的通讯编程中,大都推荐使用VC作为开发工具。然而工业控制串口通讯这个又不同于一般的串口通讯程序,因为控制外围设备传送的大都是十六进制数据(BYTE类型),所以,为了提高程序的运行稳定性,我们在编写程序进行通讯时可以不考虑传送BYTE类型数据的工作。

串口通讯目前流行的方法大概有两种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。二是利用WINAPI函数进行编程,这种编程的难度最高,要求你要掌握很多的API函数。三是利用现在网络上面提供的一些串口通讯控件进行编写,比如CSerial类等。

程序实现:

我在经过许多的项目的开发和实践中发现,采用WIN API函数进行串口的开发能够给程序员很大的控件,并且程序运也很稳定。所以我将与串口接触的函数进行封装,然后在各个工程中进行调用,效果还是比较好的,现将各个函数和调用方法列举出来,希望对各位有所帮助。

一、设置串口相关工作

#defineMAXBLOCK 2048

#defineXON 0x11

#defineXOFF 0x13

BOOL SetCom(HANDLE &m_hCom, const char *m_sPort, int BaudRate, int Databit, CString parity, CString stopbit)

{

COMMTIMEOUTS TimeOuts ///串口输出时间 超时设置

DCB dcb ///与端口匹配的设备

m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,

NULL)// 以重叠方式打开串口

if(m_hCom==INVALID_HANDLE_VALUE)

{

AfxMessageBox("设置串口部分,串口打开失败") /////重叠方式 异步通信(INVALID_HANDLE_VALUE)函数失败。

return FALSE

}

SetupComm(m_hCom,MAXBLOCK,MAXBLOCK) //设置缓冲区

memset(&TimeOuts,0,sizeof(TimeOuts))

TimeOuts.ReadIntervalTimeout=MAXDWORD // 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成 *** 作

TimeOuts.ReadTotalTimeoutMultiplier=0 //读时间系数

TimeOuts.ReadTotalTimeoutConstant=0 //读时间常量

TimeOuts.WriteTotalTimeoutMultiplier=50 //总超时=时间系数*要求读/写的字符数+时间常量

TimeOuts.WriteTotalTimeoutConstant=2000 //设置写超时以指定WriteComm成员函数中的

SetCommTimeouts(m_hCom, &TimeOuts) //GetOverlappedResult函数的等待时间*/

if(!GetCommState(m_hCom, &dcb)) ////串口打开方式、端口、波特率 与端口匹配的设备

{

AfxMessageBox("GetCommState Failed")

return FALSE

}

dcb.fParity=TRUE //允许奇偶校验

dcb.fBinary=TRUE

if(parity=="NONE")

dcb.Parity=NOPARITY

if(parity=="ODD")

dcb.Parity=ODDPARITY

if(parity=="EVEN")

dcb.Parity=EVENPARITY

if(stopbit=="1")//设置波特率

dcb.StopBits=ONESTOPBIT

//if(stopbit=="0")//设置波特率

//dcb.StopBits=NONESTOPBIT

if(stopbit=="2")//设置波特率

dcb.StopBits=TWOSTOPBITS

BOOL m_bEcho=FALSE ///

int m_nFlowCtrl=0

BOOL m_bNewLine=FALSE///

dcb.BaudRate=BaudRate// 波特率

dcb.ByteSize=Databit// 每字节位数

// 硬件流控制设置

dcb.fOutxCtsFlow=m_nFlowCtrl==1

dcb.fRtsControl=m_nFlowCtrl==1?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE

// XON/XOFF流控制设置(软件流控制!)

dcb.fInX=dcb.fOutX=m_nFlowCtrl==2

dcb.XonChar=XON

dcb.XoffChar=XOFF

dcb.XonLim=50

dcb.XoffLim=50

if(SetCommState(m_hCom, &dcb))

return TRUE ////com的通讯口设置

else

{

AfxMessageBox("串口已打开,设置失败")

return FALSE

}

}

二、读串口 *** 作:

int ReadCom(HANDLE hComm, BYTE inbuff[], DWORD &nBytesRead, int ReadTime)

{

DWORD lrc///纵向冗余校验

DWORD endtime /////////jiesuo

static OVERLAPPED ol

int ReadNumber=0

int numCount=0 //控制读取的数目

DWORD dwErrorMask,nToRead

COMSTAT comstat

ol.Offset=0 ///相对文件开始的字节偏移量

ol.OffsetHigh=0 ///开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。

ol.hEvent=NULL///标识事件,数据传送完成时设为信号状态

ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL)

endtime=GetTickCount()+ReadTime//GetTickCount()取回系统开始至此所用的时间(毫秒)

for(int i=0i<2000i++)

inbuff[i]=0

Sleep(ReadTime)

ClearCommError(hComm,&dwErrorMask,&comstat)

nToRead=min(2000,comstat.cbInQue)

if(int(nToRead)<2)

goto Loop

if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,&ol))

{

if((lrc=GetLastError())==ERROR_IO_PENDING)

{

///////////////////

endtime=GetTickCount()+ReadTime//GetTickCount()取回系统开始至此所用的时间(毫秒)

while(!GetOverlappedResult(hComm,&ol,&nBytesRead,FALSE))//该函数取回重叠 *** 作的结果

{

if(GetTickCount()>endtime)

break

}

}

}

return 1

Loop: return 0

}

三、写串口命令

int WriteCom(HANDLE hComm, BYTE Outbuff[], int size, int bWrite[])

{

DWORD nBytesWrite,endtime,lrc

static OVERLAPPED ol

DWORD dwErrorMask,dwError

COMSTAT comstat

ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL)

ol.Offset=0

ol.OffsetHigh=0

ol.hEvent=NULL ///标识事件,数据传送完成时,将它设为信号状态

ClearCommError(hComm,&dwErrorMask,&comstat)

if(!WriteFile(hComm,Outbuff,size,&nBytesWrite,&ol))

{

if((lrc=GetLastError())==ERROR_IO_PENDING)

{

endtime=GetTickCount()+1000

while(!GetOverlappedResult(hComm,&ol,&nBytesWrite,FALSE))

{

dwError=GetLastError()

if(GetTickCount()>endtime)

{

AfxMessageBox("写串口时间过长,目前串口发送缓冲区中的数据数目为空")

break

}

if(dwError=ERROR_IO_INCOMPLETE)

continue //未完全读完时的正常返回结果

else

{

//发生错误,尝试恢复!

ClearCommError(hComm,&dwError,&comstat)

break

}

}

}

}

FlushFileBuffers(hComm)

PurgeComm(hComm,PURGE_TXCLEAR)

bWrite=0

return 1

}

四、调用方法很简单,只需要将你的串口参数进行简单的设置就可以了。比如:

BOOL Main_OpenCom()//设置COM

{

int Boundrate=9600//波特率

CString StopBits="1"//停止位

int DataBits=8//数据位

CString Parity="ODD"//奇偶校验

CString m_Port="COM1"

return SetCom(m_hCom1,m_Port,Boundrate,DataBits,Parity,StopBits)

}

void Main()

{

int SIZE

DWORD BytestoRead=52*Count+6//要11个字节

int BWRITE[2]

int ReadTime=2000

BYTE Outbuff[12]={0xff,0x00,0xea,0xff,0xea,0xff,0,0,0,0,0,0}

SIZE=sizeof(Outbuff)

WriteCom(m_hCom,Outbuff,SIZE,BWRITE)

ReadCom(m_hCom,m_Inbuff,BytestoRead,ReadTime)

//进行湘阴的解包处理

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11226888.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存