zoukankan      html  css  js  c++  java
  • 教程-Delphi MSComm 实时串口通讯

    Delphi  MSComm 实时串口通讯 

    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;

    delphi使用mscomm处理16进制 ()

    下面这些代码是针对发送和接收为16进制处理的。
    var
    senddata:array[1..10] of char;
    reData:array of Variant;
    sendstr:string;
    restr:string;
    i:longint;
    begin
    mscomm1.CommPort := 1;                     //指定端口
    mscomm1.Settings := '9600,N,8,1';         //其它参数
    mscomm1.InBufferSize := 1024;             //接收缓冲区
    mscomm1.OutBufferSize := 1024;             //发送缓冲区
    mscomm1.InputMode := comInputModeBinary; //接收模式
    mscomm1.InputLen := 0;                     //一次读取所有数据
    mscomm1.SThreshold := 0;                   //一次发送所有数据
    mscomm1.InBufferCount := 0;               //清空读取缓冲区
    mscomm1.OutBufferCount := 0;               //清空发送缓冲区
    mscomm1.PortOpen:=true;                     //打开端口
    MSComm1.RThreshold := 16;               //设置接收多少字节开产生oncomm事件
    senddata[1]:=chr($06);                           //要发送的数据
    senddata[2]:=chr($03);
    senddata[3]:=chr($00);
    senddata[4]:=chr($03);
    senddata[5]:=chr($10);
    sendstr:='';
    for i:=1 to 5 do
    sendstr:=sendstr + senddata[i];
    mscomm1.output:=sendstr;                       //发送数据
    i:=0;
    bzw:=false;

    repeat
         sleep(10);
         Application.ProcessMessages;
         i := i + 1;
         If i > 30000 Then
           begin
             showmessage('发送超时!');
             break;
           end;
    Until bzw = true;
    redata:=mscomm1.Input;       接收数据
    restr:='';
    for i:=0 to vararrayhighbound(redata,1) do
           restr:=restr + inttohex(redata[i],2)+' ';
    mscomm1.PortOpen:=false;
    flatmemo1.Text:=restr;
    end;
    //oncomm事件
    procedure TForm1.MSComm1Comm(Sender: TObject);
    begin
    case mscomm1.CommEvent of
         comEvReceive: bzw := true;
    end;
    end;

  • 相关阅读:
    数学考试
    奇♂妙拆分
    11.25
    11.21
    11.20
    11.19
    11.18
    11.15
    11.14作业
    11.14
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4654490.html
Copyright © 2011-2022 走看看