在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便。MSComm的控件属性较多,常用的属性如下:
1).CommPort:设置或返回串行端口号,缺省为1。 2).Setting:设置或返回串口通信参数,格式为“波特率,奇偶校验位,数据位,停止位”。例如:MSComm1.Setting:=9600,n,8,1 3).PortOpen:打开或关闭串行端口,格式为:MSComm1.PortOpen:={True|False} 4).InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。 5).InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。 6).RThreshold:该属性为一阈值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。 7).SThreshold:该属性为一阈值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件。 8).InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。 9).Input:从接收缓冲区读取一串字符。 10).OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。 11).OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。 12).OutPut:向发送缓冲区传送一串字符。 在通信过程中发生的错误或事件会引发OnComm事件,并由CommEvent属性值反映错误类型,程序根据该属性值来执行不同的操作。CommEvent属性值及其含义如下: 1).ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。 2).ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。 3).ComEvFrame:值为1004,硬件检测到帧错误。 4).ComEvRxOver:值为1008,接收缓冲区溢出。 5).ComEvTxFull:值为1010,发送缓冲区溢出。 6).ComEvRxParity:值为1009,奇偶校验错误。 7).ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符。 4.应用实例 下面通过一个实例介绍Delphi利用MSComm通信控件,开发PC机通过串口对某试验厂路面荷载进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动就可用于其它数据采集或者实时控制程序中。 该项目上位机采用Delphi编写,数据采集仪采用研华ADAM5510作为下位机采集实时压力数据,采用AscII方式传送数据,数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。数据通信的具体格式为:。 程序用到的全局变量为: ReceiveStr :String; //接受Ascii码字符数据字符串 F1,F2,F3,F4,Fz,Fa:Double; //四路压力值数据,总压力值,平均压力值 程序中绘制的压力曲线采用TChart组件,变量定义为: FChart: TChart; 1).串口初始化 with MSComm do begin CommPort:=1; //使用Com1 Settings:=9600,n,8,1; //设置通信口参数 InputLen:=1; //设置Input一次从接受缓冲区读取字节数为1 InBufferCount:=0; //清除接受缓冲区 OutBufferCount:=0; //清除发送缓冲区 InBufferSize:=50; //设置接受缓冲区为50字节 OutBufferSize:=2; //设置发送缓冲区为2字节 RThreshold:=1; //设置接受一个字节产生OnComm事件 InputMode:=ComInputModeText; // 设置接受数据模式为二进制方式 If (not PortOpen )then //判断通信口是否打开 PortOpen:=True else ShowMessage(串口已经打开!); end; 2).数据接收与处理 为了达到实时数据采集的目的,实时数据采集处理程序采用MSComm的事件驱动方式。 procedure TForm1.MSCommComm(Sender: TObject); var buffer :Olevariant; sTemp:string; cNow :Char; tmpX:Double; begin i f MSComm.CommEvent = comEvReceive then //接受事件 begin buffer:=MSComm.Input; //读取接受到的数据 sTemp:=buffer; cNow:=sTemp[1]; if((cLast=Chr(13))and(cNow=Chr(10)))then begin sF1:=Trim(sF1); dF1:=StrToFloat(sF1); with SeriesDepth do //利用TChart绘制深度曲线 begin tmpX:=XValues[1]-XValues[0]; Delete(0); AddXY( XValues.Last+tmpX,dF1,,clGed); end; sF1:=; end; if((cLast<>Chr(13))and(cNow<>Chr(10)))then begin sF1:=sF1+cNow; end; cLast:=cNow; end; end; 3).串口关闭 If (MSComm.PortOpen) then MSComm.PortOpen:=False;
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论