狂飙人生 發表於 2019-11-6 14:57:00

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);&nbsp;<br>  AddXY( XValues.Last+tmpX,dF1,,clGed);<br>  end;<br>  sF1:=;<br>end;<br>if((cLast&lt;&gt;Chr(13))and(cNow&lt;&gt;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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指定端口<br>mscomm1.Settings := '9600,N,8,1';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其它参数<br>mscomm1.InBufferSize := 1024;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //接收缓冲区<br>mscomm1.OutBufferSize := 1024;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送缓冲区<br>mscomm1.InputMode := comInputModeBinary; //接收模式<br>mscomm1.InputLen := 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一次读取所有数据<br>mscomm1.SThreshold := 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一次发送所有数据<br>mscomm1.InBufferCount := 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //清空读取缓冲区<br>mscomm1.OutBufferCount := 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //清空发送缓冲区<br>mscomm1.PortOpen:=true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开端口<br>MSComm1.RThreshold := 16;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置接收多少字节开产生oncomm事件<br>senddata:=chr(<span class="MathJax_Preview"><span id="MathJax-Element-1-Frame" class="MathJax" data-mathml="&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;mn&gt;06&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;;&lt;/mo&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;/&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x8981;&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x53D1;&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x9001;&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x7684;&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x6570;&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;mo&gt;&amp;#x636E;&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;:=&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;/math&gt;"><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="&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;mn&gt;00&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;;&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;:=&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;/math&gt;"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送数据<br>i:=0;<br>bzw:=false;<br><br>repeat<br>&nbsp;&nbsp;&nbsp;&nbsp; sleep(10);<br>&nbsp;&nbsp;&nbsp;&nbsp; Application.ProcessMessages;<br>&nbsp;&nbsp;&nbsp;&nbsp; i := i + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp; If i &gt; 30000 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showmessage('发送超时!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br>Until bzw = true;<br>redata:=mscomm1.Input;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接收数据<br>restr:='';<br>for i:=0 to vararrayhighbound(redata,1) do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>&nbsp;&nbsp;&nbsp;&nbsp; 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]
查看完整版本: Delphi MSComm 实时串口通讯