用DELPHI如何通过串行口读取电话交换机的数据?(100分)

  • 主题发起人 主题发起人 songyp
  • 开始时间 开始时间
S

songyp

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在需要做一个电话计费的软件,以前我用delphi写了一个计费的软件,可以接收电话交换机的数据。但是我现在在HJK-120集团电话交换机上不能正常接受数据,我知道它的数据格式,请问如何做?(在DELPHI下用MSCOMM 或SPCOMM控件都可以,最好给出源码).
数据格式如下:
1、串口配置:2400/无校验/8/2
向交换机每两个字节需要延时30毫秒,双方通讯格式为16进制
2、保持通讯:通讯期间每隔10秒发送 CC00020C 命令,以保持通信
3、话单:从交换机接受:
CC 65 15 PP QQ QQ QQ QQ QQ QQ QQ RR RR RR RR RR SS SS SS TT TT UU UU
接受后发往交换机应答信号: CC 06 05 0B 00 00 00 0C
说明:CC 65 15 特征字头
PP PP 主叫号码 2字节 物理号
QQ....QQ 被叫号码 7字节 BCD码
RR....RR 始话时间日期 5字节 月日时分秒
SS SS SS SS 时长 3字节
TT TT 账号(十六进制) 如是FFFF表示非密码记账
UU UU 内部保留
例如:收:CC651500A702165356786FFF1207153211000115FFFF000A
发:CC 06 05 0B 00 00 00 0C
主叫:为167(A7)的分机
被叫:021653556786
始话:12月7日15时32分11秒
时长:0时1分15秒
非密码记账
 
这不是一个纯粹的串口通信问题吗?有很多参考资料的。
 
如果要找你的Delphi程序不能正常接受数据的原因的话,可能需要把你的原码贴出来。
若重新写程序解决这个问题,则
1.有很多控件可以利用,
2.也可以自己用Windows API来写
不过用方法2比较灵活。
 
我通过mscomm控件的output属性发送字节,但是不成功。
 
CPort控件就很不错.
 
这应该比较简单,可惜现在毕业比较忙,否则帮你做个:(
 
Spcomm控件有源码,比较好控制.接发数据应该比较容易.
最重要的是根据你的通讯协议去分析接收的数据和相应的
超时控制
 
mscomm?你怎么写的?源码!!!
 
我使用的使spcomm 遇到一个问题,就是我发送的数据CC00020C和CC06050B0000000C在
我接收时又原样接收回来,根本不是我所要的数据
 
不会是程序的问题吧
呵呵 新的一年里我看到的第一个怪事 你还是把相关的部分原码贴出来
 
直接参考spcomm的源代码,调用winapi来通信岂不更灵活,也好控制。
 
unit sptest;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SPComm, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Comm1: TComm;
Timer1: TTimer;
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
viewstring:string;
i:integer;rbuf,sbuf:array[1..4] of byte;
rbuf1:array[1..8] of byte;
procedure senddata;
procedure outsenddata;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
sbuf[1]:=byte($cc);
sbuf[2]:=byte($00);
sbuf[3]:=byte($02);
sbuf[4]:=byte($0c);
senddata;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
comm1.StopComm ;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var i:integer;
begin
timer1.Enabled :=false;
viewstring:='';

for i:=1 to bufferlength do
viewstring:=viewstring+inttohex(rbuf,2)+'';
viewstring:='接收'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
sbuf1[1]:=byte($cc);
sbuf1[2]:=byte($06);
sbuf1[3]:=byte($05);
sbuf1[4]:=byte($0b);
sbuf1[5]:=byte($00);
sbuf1[6]:=byte($00);
sbuf1[7]:=byte($00);
sbuf1[8]:=byte($0c);
outsenddata;
timer1.Enabled :=true;
end;

procedure senddata;
var i,z:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
z:=0;
for i:=1 to 4 do
begin
z:=z+1;
if z=3 then begin sleep(30);z:=0;end ;
if not form1.Comm1.WriteCommData(@sbuf,1) then
begin
commflg:=false;
break;
end;
viewstring:=viewstring+inttohex(sbuf,2)+'';
end;
viewstring:='发送'+viewstring;
form1.memo1.lines.add(viewstring);
form1.memo1.lines.add('');
if not commflg then messagedlg('发送失败',mterror,[mbyes],0);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;

procedure TForm1.FormHide(Sender: TObject);
begin
comm1.StopComm ;
end;

procedure outsenddata;
var i,z:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
z:=0;
for i:=1 to 8 do
begin
z:=z+1;
if z=3 then begin sleep(30);z:=0;end ;
if not form1.Comm1.WriteCommData(@sbuf1,1) then
begin
commflg:=false;
break;
end;
viewstring:=viewstring+inttohex(sbuf1,2)+'';
end;
viewstring:='发送'+viewstring;
form1.memo1.lines.add(viewstring);
form1.memo1.lines.add('');
if not commflg then messagedlg('发送失败',mterror,[mbyes],0);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
sbuf[1]:=byte($cc);
sbuf[2]:=byte($00);
sbuf[3]:=byte($02);
sbuf[4]:=byte($0c);
senddata;
end;

end.
 
viewstring:=viewstring+inttohex(rbuf,2)+'';
~~~~~~~ 怎么接收数据的啊 不明白 最后加''也不明白

mt=array[1..4] of byte;
.......
rbuf:=mt(buffer);
.......
viewstring:=viewstring+inttohex(rbuf,2)+'';
.......

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
817
import
I
后退
顶部