利用VC_实现实时串行数据的接收_分离及动态存储(2)
时间:2026-01-17
时间:2026-01-17
利用VC++实现实时串行数据的接收、分离及动态存储
数据库? 选项中选择 查看数据库不使用文件支持 选项,点击DataSource按钮,选择前面创建的数据源,以后几步都是按默认选项,最后在基类中选择CrecordSet类,这样就建立了应用程序框架。1 2 用Windows通信API函数实现串行通信的
步骤
一般情况下的串行通信通常采用以下三种方法
[2]
据位、停止位、奇偶校验)选择窗口,在程序中编写Switch条件判断语句来实现。这样,不仅现场能方便地选择通信参数、进行串行通信参数的测定,以便进一步实现卷材数据的记录并与数据库系统联接,且在程序交付使用之后可以给用户带来便利,用户在不了解程序内部程序的前提下,也可在现场根据通信环境灵活选择通信参数。2.2 数据的分离
考虑到从现场发送过来的数据有大量的重复非数字字符,并且数据格式是相同的,如果都原封不动地接收过来,并且存储在数据库中,不仅存储的数据量较大,而且不方便用户查看,所以在接收大量数据时,可以根据数字和字母及其它不可见字符的ASCII码值对数据进行分离、滤除。对于要保留的字符可以利用传输中固定的格式和有效标志进行保留,把不需要的数据都过滤掉。例如数0~9的ASCII码值在48~57范围内而其它字符在48~57之外,这样利用ASCII码的数值就可以把数字字符分离出来。例如变量Coil的分离如下:
for(inti=0;(receive[i]!= \0 );i++){switch(k)
{case0:for(i=0;(receive[i]!= \r );i++); break; case1:
{while(receive[i]!= E &&receive[i-1]!= T ) {if((receive[i]> 0 )&&(receive[i]<= 9 )) {Coil[ii]=receive[i];ii++; }i++;data1.m
Coil=atoi(Coil);}
Coil为数据显示对话框中的变量
//data1.m
,一是利用Windows的通信API函数,二是利
用VC++(或其它语言)的标准通信函数inp和
outp,三是利用MSCOMM控件。本程序采用的是Windows的通信API函数,实现步骤如下[3]:
IDCOM=CreateFile( COM1 ,GENERIC0,NULL,OPENFILE
FLAG
EXISTING,FILE
WRITE|GENERIC
RANDOM
READ,
FLAG
ACCESS
OVERLAPPED,NULL);//打开串行口
BuildCommDCB( COM1:9600,N,8,1 ,&dcb);//创建数据控制块DCB结构
SetCommState(IDCOM,&dcb);//将结构DCB的主要参数设置到串行口
ddf=timeSetEvent(500,1,TimeProc,NULL,TIME置多媒体定时器和调用回调函数timeKillEvent(ddf);//关闭定时器
SetCommTimeouts(IDCOM,lptimeout);//设置读写操作的时间溢出ReadFile(IDCOM,receive1,1,&num,NULL);//读串行口ddf=timeSetEvent(500,1,TimeProc,NULL,TIME置多媒体定时器和调用回调函数CloseHandle(HANDLEIDCOM)//关闭串行口
PERIODIC);//设PERIODIC);//设
在Windows系统中,定时器也是一种输入设备,通常告诉Windows一个时间间隔,Windows就会以此时间间隔触发程序,本软件使用的定时器函数的标准格式为:
MMRESULTtimeSetEvent(UINT
dwUser,UINTfuEvent)
uDelay,UINTuResolution,DWORD
//DATA中的变量在2.4节有讲解
每个参数具体含义可以参考MSDN。当事件被激活后,此函数在定时器时间到之后自动调用指定的回调函数TimeProc(),在回调函数完成数据的接收并进入回调函数后,首先关闭定时器,然后设置读写操作的时间溢出,这样只要缓冲区有数据就连续读取,直到完成对一组连续卷材数据的读取操作后才再次打开定时器,重新设置定时器,调用回调函数,如此循环。因为COM口不是共享的,所以不通信的时候要用CloseHandle()函数关闭。
有些没有数字的行直接用语句for(;receive[i]!= \r ;i++);滤掉。对于那些相连的数据以空格分离它们,程序代码如下所示:
switch(kk){case a :
{for(;(receive[i]!= );i++) {Length[iii]=receive[i]; iii++;}//Length为卷材长度 data1.m
Length=atoi(Length);
i--;}break;
2 VC++实现的串行数据分离及动态存储
2.1 参数设置
本设计没有采用BuildCommDCB()函数来创建
数据控制块DCB结构,而是采用手动填充DCB的方式,在工程中建立通信参数(包括通信速率、数 18
2.3 数据的动态存储
数据实现了正确的接收之后,就要存储到AC-CESS数据库中,数据库中的变量是与卷材数据一一对应的,数据的分离方法如2.2节所述,数据的分离和动态存储是在Ondata()成员函数中完成
Industry2004
…… 此处隐藏:268字,全部文档内容请下载后查看。喜欢就下载吧 ……