教程-Delphi MSComm 实时串口通讯
Delphi 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进制处理的。 repeat |
教程-Delphi MSComm 实时串口通讯的更多相关文章
- 用SPCOMM 在 Delphi中实现串口通讯 转
用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...
- C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程
C#串口通讯教程 简化一切 只保留核心功能 这可能是最易于理解的一篇教程 串口的定义,请自行了解. C#操作串口通讯在.Net强大类库的支持下,只需要三个步骤: 1 创建 2 打开 3 发送/接受 ...
- delphi之动态库调用和串口通讯
串口通讯: Spcomm 控件属性: CommName :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...
- 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 手机与Arduino蓝牙串口通讯实验及完整例程
安卓手机与Arduino之间采用蓝牙串口通讯,是很多智能装置和互动装置常用的控制方法,简单而有效,无需网络环境,很实用的技术. 实验采用Arduino UNO板,加了一块1602LCD屏做显示(因为只 ...
- 第五章SignalR的实时高频通讯
第五章SignalR的实时高频通讯 概述:本例子演示了如果创建一个对象与其他浏览器共享实时状态的应用程序.我们要创建的应用程序为“MoveShape”,该MoveShape页面会显示一个Html Di ...
- SignalR的实时高频通讯
SignalR的实时高频通讯 第五章SignalR的实时高频通讯 概述:本例子演示了如果创建一个对象与其他浏览器共享实时状态的应用程序.我们要创建的应用程序为“MoveShape”,该MoveShap ...
- pcommlite串口通讯库使用
MFC下串口编程使用最多的两种方法是读取注册表和使用mscomm组件,都有着或多或少的缺陷,调用系统SDK比较麻烦,而MSCOMm组件最多支持16个串口,串口号大于16的时候无法打开,遇到这种情况,可 ...
随机推荐
- 什么是UI控件
凡是带有Widget参数的组件都是控件.
- Hanoi
递归解决 汉诺塔 class Han{ int num; int steps; Han(int num){ this.num=num; } void total() { System.out.prin ...
- bp神经网络算法
对于BP神经网络算法,由于之前一直没有应用到项目中,今日偶然之时 进行了学习, 这个算法的基本思路是这样的:不断地迭代优化网络权值,使得输入与输出之间的映射关系与所期望的映射关系一致,利用梯度下降的方 ...
- Java中的数组问题
java.util.Arrays This class deals with 'real' arrays in java, in the form of T[]. Thus it doesn't d ...
- hdu 4267
一个很不错的题: 刚刚看到这个题目就感觉要用线段树或者树状数组,但是有感觉有点不同: 敲了一发简单的线段树之后果断的T了: 网上一搜题解,发现要用55颗线段树或者树状数组: 一共有k种树,然后每种树根 ...
- SQLite入门与分析(八)---存储模型(3)
写在前面:接上一节,本节主要讨论索引页面格式,以及索引与查询优化的关系. (1)索引页面格式sqlite> select * from sqlite_master;table|episodes| ...
- HDU 2493 Timer 数学(二分+积分)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2493 题意:给你一个圆锥,水平放置,圆锥中心轴与地面平行,将圆锥装满水,在圆锥某一表面开一个小洞,流出来 ...
- uml类图的几种关系
UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregati ...
- 使用GDI+ DrawDriverString实现行距及字符间距控制
主要是要将一个标题和几段文字绘制到固定大小的图片上,如果一张放不下就生成多张.在使用DrawString是发现无法控制行距 namespace TibetTest { public class ...
- 利用switch case判断是今天的第多少天
static void Main(string[] args) { while (true) { int m1 ...