求串口通信编程的资料!(100分)

  • 主题发起人 主题发起人 kataboy
  • 开始时间 开始时间
K

kataboy

Unregistered / Unconfirmed
GUEST, unregistred user!
兄弟我是从事MIS、GIS、GPS开发的!
请大家帮帮忙。现在兄弟急着要写这方面的程序。
以下是我自己写的一个小车程序:
http://zydlm.wxhc.com.cn/temp/car.exe
现在就是想小车能够从外部通过串口能接收到数据,然后按数据行驶!
要是那位大哥有资料请给小弟一点!
kataboy@xjhome.com
谢谢!

同时欢迎大家来访问我的论坛!http://zydlm.wxhc.com.cn
一个3S技术的论坛!
 
的程序中加入汇编语言吧, 汇编写的通信比较好
 
http://www.swaysoft.com/developer/srcdetail.asp?flag=2&id=166
测试串行通讯口的程序
 
其实你研究一下SpComm,Cport等控件的代码就什么都明白了,还有就是定义个应用协议,无非就是什么帧头、命令、长度、数据、帧尾、较验之类的
 
[:(] 我也正在为SpComm头痛,那位大哥给点资料
zLight@126.com
 
先把与单片机通讯的协议定一下,
再用Cport收发数据,
非常方便。我就是这样做了
 
Spcomm控件是非常好用的串口通讯控件,网上很多,找不到的话给我E-mai,我发给你alva_bai126.com
我给你介绍一下这个控件的使用:
1.属性:
CommName:表示 COM1、 COM2等串口的名字,默认是COM2.
BaudRate: 根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改;
ParityCheck:表示是否需要奇偶校验;
ByteSize:根据实际情况设定的字节长度;
Parity: 奇偶校验位;
StopBits:停止位,提供1位半;
SendDataEmpty:这是一个布尔型属性,为 true时表示发送缓存为空,或者发送队列里没
有信息;为 false时表示发送缓存不为空,或者发送队列里有信息。

2.方法
Startcomm方法用于打开串口,当打开失败时会报错。错误主要有 7种:⑴串口已经打开;
⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹
不能产生读进程;⑺不能产生写进程;
StopComm方法用于关闭串口,没有返回值;
WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word )方法 是个带有布尔
型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回
false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中
pDataToWrite是要发送的字符串, dwSizeofDataToWrite是发送字符串的长度。

3.事件
OnReceiveData :procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word)
当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。 Buffer中
是收到的数据, BufferLength是收到的数据长度,一般使用mov命令将数 据从缓存读入。
OnReceiveError : procedure(Sender: TObject; EventMask : DWORD)
当接收数据出现错误时将触发该事件。

具体实现:
1.设定 COMM1属性:
波特率: 9600;
奇偶校验位:无;
字节长度: 8;
停止位: 1;
串口: COM1。
Memo1中将显示发送和接收的数据。

2.编写源代码

//变量说明
var
fcomm: TFCOMM;
viewstring:string;
rbuf,sbuf:array[1..8] of byte;

//打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;
//关闭串口
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
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,2)+‘’ ;
viewstring:=‘接收’+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add(‘’ );
end;

 
请问一下楼上的兄弟,这个支持多线程的么?
 
兄弟们,我再问一下,我现在用的是spcomm,但是为什么那个OnModemStateChange不触发哟。
 
后退
顶部