[delphi技术]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;

时间: 2024-08-24 09:35:46

[delphi技术]Delphi MSComm 实时串口通讯的相关文章

[delphi技术]Delphi资源文件(全面分析于使用)

Delphi资源文件(全面分析之位图.光标.图标.AVI.JPEG.Wave) 几乎每个Windows应用程序都使用图标.图片.光标等资源.资源是程序的一部分,但是它是不可执行代码.下面我们就详细介绍资 源文件在Delphi5中建立和使用方法. 1.把资源放到Exe文件的优点  由于定位资源比在磁盘中定位文件花费时间少,所以应用程序执行会更快.多种资源可以放在一个文件中,减少了图标.图片.光标 等文件数量.保存资源文件时不要和工程名相同,因为Delphi创建工程时会自动创建一个和工程名相同的资源

[delphi技术]delphi源代码--后延函数

说明: 1)TTtimer控件 TTtimer控件的实质是调用WindowsAPI定时函数SetTimer和KillTimer来实现的,并简化了对WM_TIMER消息的处理过程.通过设置OnTimer事件和Interval属性,我们可以很方便的产生一些简单的定时事件. 2)Sleep函数 Sleep函数用来使程序的执行延时给定的时间值.Sleep的调用形式为Sleep(milliseconds),暂停当前的进程milliseconds毫秒.Sleep的实现方法其实也是调用Windows API的

[delphi技术]Delphi常见图象格式转换技术

TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);//图片大小(全部,1/2,1/4,1/8)TBitmap.pixelFormat:=pf8bit;//图片位数(8,24) 给大家提供几个常用的图象格式转换方法和其转换函数希望可以对你有帮助1. ICO图标转换BMP格式2. 32x32 BMP格式图象转换为 ICO格式3.转换BMP->JPEG文件格式4.JPEG 转换为BMP函数5.Bmp转换为JPEG文件格式函数---------

[delphi技术]Delphi多线程数据库查询(ADO)

ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用(CoInitialize was not called):所以,在使用任何dbGo对象前,必须手 调用CoInitialize和CoUninitialize.调用CoInitialize失败会产生"CoInitialize was not called"例外. 2.画布不允许绘画(Canvas does not allow drawing):所以,必须通过Synchronize过程来通知主线程访问主窗体

delphi学习笔记2之动态库调用和串口通讯

串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后行. 函数有两个参数,其中 pdatatowrite是

C#中的WinFrom技术实现串口通讯助手(附源码)

C#中的WinFrom技术实现串口通讯助手(附源码) ??实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口使用定时器进行定时发送数据. 5.可以打开文件夹,选择文件进行发送,并且将发送文件的内容显示在发送文本框中. 6.可以清空发送和接收文本框中的内容. 7.可以实时计算发送和接收的字节数. 8.实现打开文件夹保存发送和接收的文件内容(目前只支持.txt文件). 9.实时显示当前时间. ??功能演示 1

Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块

一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后.也有一些人在网上问我一些问题.这里写下这篇文档算是一个阶段性的总结. 假设反响好.兴许将会发上Android Stub与新版Android HAL的学习文档. 因为蓝牙模块是串口通讯机制.使用C语言来訪问,而Android的应用层採用Java.无法直接操作硬件.故使用JNI的技术实现主要功能.Android的JN

pcommlite串口通讯库使用

MFC下串口编程使用最多的两种方法是读取注册表和使用mscomm组件,都有着或多或少的缺陷,调用系统SDK比较麻烦,而MSCOMm组件最多支持16个串口,串口号大于16的时候无法打开,遇到这种情况,可以使用一个名为pcommlite的串口通讯库,下载安装之后,解压出来的文件包括 根据编译的平台选择相应的lib文件加入工程,并加入pcomm.h文件 寻找系统串口,sio_open()打开串口 sio_close()关闭串口 BYTE i = 0; CString str; // TODO: 在此添

Winform 串口通讯之地磅

继上次的读卡之后,要做一个地磅的读取. 下面是我在读卡Demo上改的读取地磅的. 地磅是一直向串口发送数据的,所以需要截取数据来一直判断数据是否合法,然后计算出结果. 其中遇到了一个小问题,文末有介绍. 本人初学菜鸟,大牛们有意见欢迎评论. 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6