delphi串口通信编程

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,这表示串口已正确地发送出数据并正确地

爱特梅尔2.4GHz最低功耗RF收发器
对LED显示屏造成干扰的原因有哪些,如何解决
Vishay 600V E系列MOSFET利用Kelvin连接来实现更好的性能
工业机器人主要用在哪一些地方
华为智慧屏真的会成为智能家庭的入口吗
delphi串口通信编程
安泰电子科技高压放大器-ATA-7010
小米MIX2携手小米Note3一起发布?小米Note3为小米MIX2让路,配置骁龙660转战中端机
在工作中如何设计电路才能避免踩雷
三星手机承认面临危机 期待Galaxy 10完成救赎
国产金融工控主板在互联网+金融发展中的关键作用
NLP、知识图谱是人工智能下一个发展方向
PCB多层线路板使用的防护技术
华为闪存存储实现NAS同步模式双活方案
微雪电子SSOP8芯片介绍
什么是VPS服务器,有哪些用处?
如何创建具有DMA和DDR3内存支持的先进PCIe,千兆以太网设计
三星/苹果掌控高端手机市场 LG手机业务无法突围
如何防止交换机环路故障
MACOM驱动程序致力于实现最大信号完整性和最小功耗