Delphi MSComm 实时串口通讯
<div>MSComm控件具有丰富的与串口通信密切相关的属性,提供了对串口进行的多种操作,进而使串行通信变得十分简便。MSComm的控件属性较多,常用的属性如下:<br>1).CommPort:设置或返回串行端口号,缺省为1。<br>2).Setting:设置或返回串口通信参数,格式为“波特率,奇偶校验位,数据位,停止位”。例如:MSComm1.Setting:=9600,n,8,1<br>3).PortOpen:打开或关闭串行端口,格式为:MSComm1.PortOpen:={True|False}<br>4).InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。<br>5).InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。<br>6).RThreshold:该属性为一阈值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为ComEvReceive的OnComm事件。<br>7).SThreshold:该属性为一阈值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为ComEvSend的OnComm事件。<br>8).InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。<br>9).Input:从接收缓冲区读取一串字符。<br>10).OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。<br>11).OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。 <br>12).OutPut:向发送缓冲区传送一串字符。<br>在通信过程中发生的错误或事件会引发OnComm事件,并由CommEvent属性值反映错误类型,程序根据该属性值来执行不同的操作。CommEvent属性值及其含义如下:<br>1).ComEvSend:值为1,发送缓冲区的内容少于SThreshold指定的值。<br>2).ComEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。<br>3).ComEvFrame:值为1004,硬件检测到帧错误。<br>4).ComEvRxOver:值为1008,接收缓冲区溢出。<br>5).ComEvTxFull:值为1010,发送缓冲区溢出。<br>6).ComEvRxParity:值为1009,奇偶校验错误。<br>7).ComEvEOF:值为7,接收数据中出现文件尾(ASCII码为26)字符。<br>4.应用实例<br>下面通过一个实例介绍Delphi利用MSComm通信控件,开发PC机通过串口对某试验厂路面荷载进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动就可用于其它数据采集或者实时控制程序中。<br>该项目上位机采用Delphi编写,数据采集仪采用研华ADAM5510作为下位机采集实时压力数据,采用AscII方式传送数据,数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。数据通信的具体格式为:。<br>程序用到的全局变量为:<br>ReceiveStr :String; //接受Ascii码字符数据字符串<br>F1,F2,F3,F4,Fz,Fa:Double; //四路压力值数据,总压力值,平均压力值<br>程序中绘制的压力曲线采用TChart组件,变量定义为:<br>FChart: TChart;<br>1).串口初始化<br>with MSComm do<br> begin<br> CommPort:=1; //使用Com1<br> Settings:=9600,n,8,1; //设置通信口参数<br> InputLen:=1; //设置Input一次从接受缓冲区读取字节数为1<br> InBufferCount:=0; //清除接受缓冲区<br> OutBufferCount:=0; //清除发送缓冲区<br> InBufferSize:=50; //设置接受缓冲区为50字节<br> OutBufferSize:=2; //设置发送缓冲区为2字节<br> RThreshold:=1; //设置接受一个字节产生OnComm事件<br> InputMode:=ComInputModeText; // 设置接受数据模式为二进制方式<br>If (not PortOpen )then //判断通信口是否打开<br> PortOpen:=True<br>else<br> ShowMessage(串口已经打开!);<br>end;<br>2).数据接收与处理<br>为了达到实时数据采集的目的,实时数据采集处理程序采用MSComm的事件驱动方式。<br>procedure TForm1.MSCommComm(Sender: TObject);<br>var<br>buffer :Olevariant;<br>sTemp:string;<br>cNow :Char;<br>tmpX:Double;<br>begin<br>i f MSComm.CommEvent = comEvReceive then //接受事件<br> begin<br> buffer:=MSComm.Input; //读取接受到的数据<br> sTemp:=buffer;<br> cNow:=sTemp;<br> if((cLast=Chr(13))and(cNow=Chr(10)))then<br> begin<br> sF1:=Trim(sF1);<br> dF1:=StrToFloat(sF1);<br> with SeriesDepth do //利用TChart绘制深度曲线<br> begin<br> tmpX:=XValues-XValues;<br> Delete(0); <br> AddXY( XValues.Last+tmpX,dF1,,clGed);<br> end;<br> sF1:=;<br>end;<br>if((cLast<>Chr(13))and(cNow<>Chr(10)))then<br>begin<br> sF1:=sF1+cNow;<br>end;<br> cLast:=cNow;<br>end;<br>end;<br>3).串口关闭<br>If (MSComm.PortOpen) then<br>MSComm.PortOpen:=False;</div><div>
<table>
<tbody>
<tr>
<td>
<div class="cnt">
<p>delphi使用mscomm处理16进制 ()</p>
<p>下面这些代码是针对发送和接收为16进制处理的。<br>var<br>senddata:array of char;<br>reData:array of Variant;<br>sendstr:string;<br>restr:string;<br>i:longint;<br>begin<br>mscomm1.CommPort := 1; //指定端口<br>mscomm1.Settings := '9600,N,8,1'; //其它参数<br>mscomm1.InBufferSize := 1024; //接收缓冲区<br>mscomm1.OutBufferSize := 1024; //发送缓冲区<br>mscomm1.InputMode := comInputModeBinary; //接收模式<br>mscomm1.InputLen := 0; //一次读取所有数据<br>mscomm1.SThreshold := 0; //一次发送所有数据<br>mscomm1.InBufferCount := 0; //清空读取缓冲区<br>mscomm1.OutBufferCount := 0; //清空发送缓冲区<br>mscomm1.PortOpen:=true; //打开端口<br>MSComm1.RThreshold := 16; //设置接收多少字节开产生oncomm事件<br>senddata:=chr(<span class="MathJax_Preview"><span id="MathJax-Element-1-Frame" class="MathJax" data-mathml="<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>06</mn><mo stretchy="false">)</mo><mo>;</mo><mrow class="MJX-TeXAtom-ORD"><mo>/</mo></mrow><mrow class="MJX-TeXAtom-ORD"><mo>/</mo></mrow><mrow class="MJX-TeXAtom-ORD"><mo>&#x8981;</mo></mrow><mrow class="MJX-TeXAtom-ORD"><mo>&#x53D1;</mo></mrow><mrow class="MJX-TeXAtom-ORD"><mo>&#x9001;</mo></mrow><mrow class="MJX-TeXAtom-ORD"><mo>&#x7684;</mo></mrow><mrow class="MJX-TeXAtom-ORD"><mo>&#x6570;</mo></mrow><mrow class="MJX-TeXAtom-ORD"><mo>&#x636E;</mo></mrow><mi>s</mi><mi>e</mi><mi>n</mi><mi>d</mi><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi><mo stretchy="false">[</mo><mn>2</mn><mo stretchy="false">]</mo><mo>:=</mo><mi>c</mi><mi>h</mi><mi>r</mi><mo stretchy="false">(</mo></math>"><span id="MathJax-Span-1" class="math"><span id="MathJax-Span-2" class="mrow"><span id="MathJax-Span-3" class="mn">06<span id="MathJax-Span-4" class="mo">)<span id="MathJax-Span-5" class="mo">;<span id="MathJax-Span-6" class="texatom"><span id="MathJax-Span-7" class="mrow"><span id="MathJax-Span-8" class="mo">/<span id="MathJax-Span-9" class="texatom"><span id="MathJax-Span-10" class="mrow"><span id="MathJax-Span-11" class="mo">/<span id="MathJax-Span-12" class="texatom"><span id="MathJax-Span-13" class="mrow"><span id="MathJax-Span-14" class="mo">要<span id="MathJax-Span-15" class="texatom"><span id="MathJax-Span-16" class="mrow"><span id="MathJax-Span-17" class="mo">发<span id="MathJax-Span-18" class="texatom"><span id="MathJax-Span-19" class="mrow"><span id="MathJax-Span-20" class="mo">送<span id="MathJax-Span-21" class="texatom"><span id="MathJax-Span-22" class="mrow"><span id="MathJax-Span-23" class="mo">的<span id="MathJax-Span-24" class="texatom"><span id="MathJax-Span-25" class="mrow"><span id="MathJax-Span-26" class="mo">数<span id="MathJax-Span-27" class="texatom"><span id="MathJax-Span-28" class="mrow"><span id="MathJax-Span-29" class="mo">据<span id="MathJax-Span-30" class="mi">s<span id="MathJax-Span-31" class="mi">e<span id="MathJax-Span-32" class="mi">n<span id="MathJax-Span-33" class="mi">d<span id="MathJax-Span-34" class="mi">d<span id="MathJax-Span-35" class="mi">a<span id="MathJax-Span-36" class="mi">t<span id="MathJax-Span-37" class="mi">a<span id="MathJax-Span-38" class="mo">[<span id="MathJax-Span-39" class="mn">2<span id="MathJax-Span-40" class="mo">]<span id="MathJax-Span-41" class="mo">:=<span id="MathJax-Span-42" class="mi">c<span id="MathJax-Span-43" class="mi">h<span id="MathJax-Span-44" class="mi">r<span id="MathJax-Span-45" class="mo">(</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="MJX_Assistive_MathML">06);//要发送的数据senddata:=chr(03);<br>senddata:=chr(<span class="MathJax_Preview"><span id="MathJax-Element-2-Frame" class="MathJax" data-mathml="<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>00</mn><mo stretchy="false">)</mo><mo>;</mo><mi>s</mi><mi>e</mi><mi>n</mi><mi>d</mi><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi><mo stretchy="false">[</mo><mn>4</mn><mo stretchy="false">]</mo><mo>:=</mo><mi>c</mi><mi>h</mi><mi>r</mi><mo stretchy="false">(</mo></math>"><span id="MathJax-Span-46" class="math"><span id="MathJax-Span-47" class="mrow"><span id="MathJax-Span-48" class="mn">00<span id="MathJax-Span-49" class="mo">)<span id="MathJax-Span-50" class="mo">;<span id="MathJax-Span-51" class="mi">s<span id="MathJax-Span-52" class="mi">e<span id="MathJax-Span-53" class="mi">n<span id="MathJax-Span-54" class="mi">d<span id="MathJax-Span-55" class="mi">d<span id="MathJax-Span-56" class="mi">a<span id="MathJax-Span-57" class="mi">t<span id="MathJax-Span-58" class="mi">a<span id="MathJax-Span-59" class="mo">[<span id="MathJax-Span-60" class="mn">4<span id="MathJax-Span-61" class="mo">]<span id="MathJax-Span-62" class="mo">:=<span id="MathJax-Span-63" class="mi">c<span id="MathJax-Span-64" class="mi">h<span id="MathJax-Span-65" class="mi">r<span id="MathJax-Span-66" class="mo">(</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="MJX_Assistive_MathML">00);senddata:=chr(03);<br>senddata:=chr($10);<br>sendstr:='';<br>for i:=1 to 5 do<br>sendstr:=sendstr + senddata;<br>mscomm1.output:=sendstr; //发送数据<br>i:=0;<br>bzw:=false;<br><br>repeat<br> sleep(10);<br> Application.ProcessMessages;<br> i := i + 1;<br> If i > 30000 Then<br> begin<br> showmessage('发送超时!');<br> break;<br> end;<br>Until bzw = true;<br>redata:=mscomm1.Input; 接收数据<br>restr:='';<br>for i:=0 to vararrayhighbound(redata,1) do<br> restr:=restr + inttohex(redata,2)+' ';<br>mscomm1.PortOpen:=false;<br>flatmemo1.Text:=restr;<br>end;<br>//oncomm事件<br>procedure TForm1.MSComm1Comm(Sender: TObject);<br>begin<br>case mscomm1.CommEvent of<br> comEvReceive: bzw := true;<br>end;<br>end;</span></span></span></span></span></span></p>
</div>
</td>
</tr>
</tbody>
</table>
</div><br><br>
来源:https://www.cnblogs.com/approx/p/11805187.html
頁:
[1]