delphi串口通信编程

编程实验

72人已加入

描述

delphi

德尔菲法,也称专家调查法,1946 年由美国兰德公司创始实行。该方法是由企业组成一个专门的预测机构,其中包括若干专家和企业预测组织者,按照规定的程序,背靠背地征询专家对未来市场的意见或者判断,然后进行预测的方法。

Delphi串口通讯可以同过以下几种方式:

1.windows API函数。

2.Spocmm组件。

3.PComm库函数。

4.Mscomm控件。

1.windows API函数。

由于API函数实现起来比较麻繁,这里就不做介绍了,主要介绍其它三种方式 。

第三方组件或控件封装了API函数,简化了编程的难度,并提供详细帮助。

2.Spocmm组件。

SPcomm是专为delphi开发的组件,虽然它也是封装了windows api,但是我们可以看到它的源代码。它提供了事件驱动的方式接收数据,在编程的时候,我们可以在OnReceiveData函数中接收到数据,并做相应的处理,

串口通信

SPcomm组件的主要属性:

CommName:设置通讯端口

BaudRate:设置端口波特率

StartComm:打开串口

StopComm:关闭串口

WriteCommData:向串口写数据函数

OnReceiveData:接收数据事件

3.PComm库函数。

PComm库函数

PComm 库函数是***MOXA公司提供的,他为用户提供了基于win32 api的开发接口。

PComm库函数分为7大类

控制函数

数据输入函数

数据输出函数

状态函数

事件驱动函数

传输文件函数

特殊设定函数

控制函数主要包括sio_open,sio_close,sio_ioct,sio_flush

sio_open(PortNum) 打开串口

sio_close(PortNum) 关闭串口

sio_ioct(PortNum, baud, mode)设置串口的工作模式,包括 波特率,数据位,停止位,效验等

sio_flush(portNum,func)清除发送,接收缓冲区 其中func 为0清空输入 ,为1清空输出,为2清空输入输出

数据输入函数主要包括sio_getch,sio_read

sio_getch(PortNum) 从输入缓冲区读一个字符

sio_read(PortNum,buf,len)从输入缓冲区读指定个数的字符

数据输入函数主要包括sio_putch sio_write

sio_putch(PortNum) 写一个字符到输出缓冲区

sio_write(PortNum,buf,len)写指定个数的字符到输出缓冲区

状态函数主要包括 sio_lstatus,sio_getbaud,sio_getmode

sio_lstatus(portNum)获取串口的CTS,DSR,DCD,RI线的状态

sio_getbaud(portNum)获取串口的波特率

sio_getmode(portNum)获取串口的工作模式。对应sio_ioct函数

事件函数主要包括 sio_term_irq,sio_cnt_irq

sio_term_irq(portNum,func,code) 当接收到指定字符时响应事件,func为回调函数名,code为指定的字符

sio_cnt_irq((PortNum,func,count) 当接收到指定个数字符时响应事件,func为回调函数名,count接收的个数

传输文件函数主要包括sio_FtASCIIRx,sio_FtASCIITx

sio_FtASCIITx(portNum,fname,func,key) 发送一个文本文件

sio_FtASCIIRx(portNum,fname,func,Key,sec)接收一个文本文件

由PComm库提供的函数可以看出来PComm的接口还是挺丰富的。并且MOXA公司为我们提供PComm详细的使用说明。

4.Mscomm控件。

(1)Mscomm控件是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。它提供了两种处理通信的方法:事件驱动方式,查询方式。

1事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中接收到字符等,在种情况下,可以利用 MSComm控件的 OnComm 事件捕获并处理这些通讯事件。OnComm事件还可以检查和处理通讯错误。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。

2查询方式实质上还是事件驱动。查询方式是通过检查 CommEvent属性的值来查询事件和错误,并做相应的处理。在有些情况下,这种方式还是显得挺便捷的。

MSComm控件的常用属性

CommPort 设置并返回通讯端口号。

Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。

Input 从接收缓冲区返回和删除字符。

Output 向传输缓冲区写一个字符串。

编写源代码

//变量说明

var

fcomm: TFCOMM;

viewstring:string;

i:integer;

rbuf,sbuf:array[16] of byte;

//打开串口

procedure TFCOMM.FormShow(Sender: TObject);

begin

comm1.StartComm;

end;

//关闭串口

procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);

begin

comm1.StopComm;

end;

//自定义发送数据过程

procedure senddata;

var

i:integer;

commflg:boolean;

begin

viewstring:=‘’ ;

commflg:=true;

for i:=1 to 6 do

begin

if not fcomm.comm1.writecommdata(@sbuf[i],1) then

begin

commflg:=false;

break;

end;

//发送时字节间的延时

sleep(2);

viewstring:=viewstring+ inttohex(sbuf[i],2)+‘’ ; end;

viewstring:=‘发送’+ viewstring;

fcomm.memo1.lines.add(viewstring);

fcomm.memo1.lines.add(‘’ );

if not commflg then messagedlg(‘发送失败 !’ ,mterror,[mbyes],0);

end;

//发送按钮的点击事件

procedure TFCOMM.Btn_sendClick(Sender: TObject);

begin

sbuf[1]:=byte($ f0); //帧头

sbuf[2]:=byte($ 01); //命令号

sbuf[3]:=byte($ ff);

sbuf[4]:=byte($ ff);

sbuf[5]:=byte($ 01);

sbuf[6]:=byte($ f0); //帧尾

senddata;//调用发送函数

end;

//接收过程

procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);

var

i:integer;

begin

viewstring:=‘’ ;

move(buffer^,pchar(@rbuf^),bufferlength);

for i:=1 to bufferlength do

viewstring:=viewstring+ inttohex(rbuf[i],2)+‘’ ;

viewstring:=‘接收’+ viewstring;

memo1.lines.add(viewstring);

memo1.lines.add(‘’ );

end;

如果 memo1上显示发送 F0 01 FF FF 01 F0和接收到 F0 01 FF FF 01 F0,这表示串口已正确地发送出数据并正确地

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
陈陈1 2018-08-19
0 回复 举报
这两个控件在哪里找到 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分