有串口通讯开发经验的人进!

lylen 2005-02-28 12:51:35
在与串口进行通讯的时候,我们要用到例如TMSComm控件来实现串口的通讯,dll的使用使得程序的重用得到增强。在delphi中,已经知道要用的dll,我们在进行串口通讯的检测的时候,是不是说我们也要借助于TMSComm控件?我们用TMSComm控件可以获得端口句柄,那dll中的获得端口句柄是怎么一回事呢?两者有什么区别呢?
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
才子鸣 2005-02-28
  • 打赏
  • 举报
回复
基本上没什么区别,
获得的都是同一个句柄
lylen 2005-02-28
  • 打赏
  • 举报
回复
回复:kernelspirit(核心精神)
哇塞!简直真的是高人啊!听你这么解释,让我茅塞顿开,受益匪浅啊!主要是刚接触delphi不懂的东西太多了!现在就连关于类型转换的问题我都头大!例如:在vc++中定义变量类型pchar,在delphi中需要定义成什么类型啊?又要用到什么类型转换函数啊!?头又大了!...............
kernelspirit 2005-02-28
  • 打赏
  • 举报
回复
回复:
这些资料我都看烂了。我的问题是我们用TMSComm控件可以获得端口句柄,那dll中的获得端口句柄是怎么一回事呢?两者有什么区别呢?

端口句柄是每个串口打开时,Windows分配的设备句柄;
"DLL中的获得端口句柄"你说的不太明了,可能是
1、调用某个函数返回的通信端口句柄,它与TMSComm获得的句柄完全一样;
2、也可能是DLL本身的句柄,两个天壤之别。
kernelspirit 2005-02-28
  • 打赏
  • 举报
回复
你的意思好像是在DLL中封装了TMSComm,并实现了自己的协议,那样也好,那么DLL应该暴露数据读写的接口函数了,通信句柄可能是DLL中内部的对象,使用此DLL的客户可能不需要知道的,只要调用函数即可,最好不用来回传句柄,因为你不知道DLL内部的通信句柄什么时候失效!
iltg 2005-02-28
  • 打赏
  • 举报
回复
Cport如何(相比Spcomm)?
sxy_9761 2005-02-28
  • 打赏
  • 举报
回复
见议使用TSPCOMM
lylen 2005-02-28
  • 打赏
  • 举报
回复
有没有控件和API一起来使用的例子呢?
gzmhero 2005-02-28
  • 打赏
  • 举报
回复
干吗非盯着句柄不放呢,你如果用控件来处理发送接收,不要管句柄,只要调用控件的属性,函数就行了.
除非你发送接收用API来写。
gzmhero 2005-02-28
  • 打赏
  • 举报
回复
发送数据:
comm1.writecommdata(@sbuf[i],1)
接收数据:
procedure TCOMM.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;
lylen 2005-02-28
  • 打赏
  • 举报
回复
这些资料我都看烂了。我的问题是我们用TMSComm控件可以获得端口句柄,那dll中的获得端口句柄是怎么一回事呢?两者有什么区别呢?
gzmhero 2005-02-28
  • 打赏
  • 举报
回复
Delphi 中串口通讯的实现
  用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序。利用API编写串口通信程序较为复杂,需要掌握大量通信知识,其优点是可实现的功能更强大,应用面更广泛,更适合于编写较为复杂的低层次通信程序。相比较而言,利用SPComm控件则相对较简单,该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作。

  使用控件这一方法容易掌握,而SPCOMM支持多线程,所以SPCOMM控件的应用更加广泛。结合实例详细介绍SPCOMM的使用。

一.SPCOMM控件的安装

1.选择下拉菜单Component的第二项Install Component 。


  弹出窗口,在Unit file name 处填写控件SPCOMM控件所在路径,其它可用默认值,点击OK按纽。

2.安装成功后,system控件面板中将出现一个红色控件COMM。现在使用COMM控件可以象Delphi自带控件一样使用。


二.SPCOMM的主要属性,方法和事件

1.属性

CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。

BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。

ParityCheck:奇偶校验。

ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。

Parity:奇偶校验位

pBits:停止位

SendDataEmpty:这是一个布尔属性,为true时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。

2.方法

  Startcomm过程用于打开串口,当打开失败时通常会报错,错误主要有7种:
⑴串口已经打开 ;
⑵打开串口错误 ;
⑶文件句柄不是通讯句柄;
⑷不能够安装通讯缓存;
⑸不能产生事件 ;
⑹不能产生读进程;
⑺不能产生写进程;

  StopComm过程用于关闭串口,没有返回值。

  函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后执行。函数有两个参数,其中 pdatatowrite是要发送的字符串,dwsizeofdatatowrite 是发送的长度。

3.事件

OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 
  当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。

OnReceiveError : procedure(Sender: TObject; EventMask : DWORD)
  当接受数据时出现错误将触发该事件。

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧