请诸位大哥帮小弟看看这个串口通信怎么做?(150分)

R

rifleli

Unregistered / Unconfirmed
GUEST, unregistred user!
诸位大哥:
最近我急需完成一个数据采集程序,本来做得差不多了,可对方突然提出增加串口通信功能,
因为小弟不是学计算机的,所以对这方面几乎一无所知,急需各位大哥的帮助.我想利用串口通信
控件:spcomm来完成,具体要求很简单,就是把我这台计算机上的两个数值:瞬间流量和总累计量
传给对方计算机.对方给了我一个通信协议,因为知识的缺乏,就是这份协议让我摸不着头脑.
通信协议如下:
数采仪表RS-232通讯协议:
一 发送协议:(对方发过来的数据)
1.协议格式:
AA AA AA AA AA AA AA 07 02 站号 01 00 和较验 纵较验
2.协议说明:
其中前7个"AA"为通讯标识(为增加通讯稳定,应不少于7个AA);
"07"为通讯协议中固定数值;
"站号"为流量记号即仪表表号;
"01"为通讯协议中固定数值;
"00"为控制数值,有255个可选值,其中"00"代表回要数据;
"和较验"为通讯标识即7个"AA"后,"和较验"之前的所有数值之和;
"纵较验"为通讯标识即7个"AA"后,"和较验"之前的所有数值的异或值;
二 接受协议 (需要我发出的数据)
1.协议格式:
FA 20个00 13个FA 00 00 1A FF E5 站号 5个00 01 42 瞬时流量 总累计量 和较验 纵较验 4个00
2.协议说明:
FA 20个00 13个FA 为通讯数据头(只是为增加通讯的可靠性,丢失个别字节不会影响通讯的完整性);
00 00 1A FF E5 为通讯的固定标识字节;
站号为一个字节的仪表表号;
5个00 01 42 为通讯的固定标识字节;
瞬时流量:由三个字节表示(XX XX XX 吨/小时);
总累计量:由四个字节表示(XX XX XX XX 吨)
和较验:从13个FA之后的第一个字节起(00)到“和较验”前一字节止,所有字节的和,如果数值大于0FFH,则只取低一位字节,和较验占一个字节.
纵较验:从13个FA之后的第一个字节起(00)到“和较验”前一字节止,所有字节的异或值,占一个字节.
4个00为数据尾,为固定字节.

例如:收到的数据为:
FA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FA FA FA FA FA FA FA FA FA FA FA FA FA 00 00 1A FF E5 01 00 00 00 00 00 01 42 00
02 50 00 00 14 01 A9 05 00 00 00 00
则取得的瞬时流量=0002.50 吨/小时
总累计量=00001401吨 ;
-----------------------------------------------------------------------------
现在小弟想问:如何利用spcomm控件来完成这项工作? 请大哥尽量给出一些代码.如果
有其他更好的方法也请大哥告之,谢谢诸位! 小弟愿以150分相谢.我的信箱是rifle_li@hotmail.com
 
我也正在用spcomm控件,不太熟,学习学习。
 
给你发了一个例子和一个DLL,你注意收下。有什么问题再联系。
我给你的东西,很好用的。
 
谢谢truecat大哥,再请教一个问题,我看了您的例子,串口发送的是字符.我注意了一些串口控件,
[:)]发现其串口发送的都是字符,是否串口控件或API函数都是这样? 是不是不能直接发送数字,
而必须经过一个数字->字符->发送->接收->字符->数字的过程呢?
 
能直接发送数字,spcomm也支持;和单片机通讯时常需要用数字传输;
你好好找找spcomm,在论坛里!
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, SPComm;
type
TForm1 = class(TForm)
Comm1: TComm;
Memo1: TMemo;
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s: string;
begin
SetLength(S, BufferLength); //接收RS232的数据并显示Memo1上。
Move(Buffer^, PChar(S)^, BufferLength);
Memo1.Lines.Add(S);
Memo1.Invalidate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.startcomm;//创建窗体时,将comm1控件打开。
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;//关闭窗体时,将comm1控件关闭。
end;
end.
 
数字和字符在DELPHI里可用ord和chr互相转换呀,
spcomm也可直接发送byte的东东,但实际上也是转换过传输的。。。
 
好的,感谢各位大哥,特别是turecat和wyb-star!
 
多人接受答案了。
 
顶部