一条信息包含16进制数和字符串,怎么通信法?(200分)

  • 主题发起人 主题发起人 nickle
  • 开始时间 开始时间
N

nickle

Unregistered / Unconfirmed
GUEST, unregistred user!
信息格式如下
头(0xcc)+信息(任意长字符串)+识别码(1字节,数字1--10或字符a--j中的一个)+
尾(0xee)+crc(2字节)
怎么完成发送,如果对方发送,要如何接收并区分头和尾和识别码?
 
你要通过什么媒体发送?
网络还是串口?
网络的话,把这个串用stream直接发送就看可以啊,
如果对方发送,读到缓冲区之后,用copymemory()截取。
 
字符和16进制数在传送时是没有分别的,都是byte的形式
HexByte := ord(CharByte);
CharByte := chr(HexByte);
至于区分通信帧格式,就需要进行语法分析了,
象你给出的通信协议,变长数据头上却没有长度,实在很糟糕
 
是通过串口通信,我用spcomm控件,能不能把字符也转换成byte然后一起发送。
还有一个问题就是接收到的数据怎么放到byte数组去,这样才能按字节区别。
 
在delphi中字符类型和byte类型是一样的,不用转换,直接可以用。
但是问题是通过串口通信你注意有些字符是传送不了的如:#19,#17
至于把数据放入数组,我上边已经说了,
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
DestStr:array of char;
^^^^^^^^^^^^^^^^^^^^^^^^也可以是array of byte;
begin
setlength(DestStr,NewLength);
copymemory(DestStr,Buffer,NewLength);
end;

这里DestStr是动态数组,也就是指针,你注意不要造成非法操作。
 
接收的数据可以放到数组中去:(spcomm的具体函数名记不清了)
var rec:array[0..200] of byte;
...
com1.recievebuf(rec, 200)
 
steve: #19 #17是流控字符,要发送这两个字符需要关闭软件流控
 
我当然知道,但是如果是微机和单片机通信,而且单片机只有RxD,TxD,Gnd怎么办?
 
你说的是用硬件流控,单片机可以用口线模拟
不过一般情况下没有必要用流控,简单三线通信就可以
 
iie:我知道怎么发送16进制数据了,但还是不会把收到的字符放到数组里。
steve能不能说具体一点。
 
我上边Comm1ReceiveData()那段函数不好使?
var DestStr:array of char; //定义动态数组,也可以是array of byte
begin
setlength(DestStr,NewLength);//设置数组长度
copymemory(DestStr,Buffer,NewLength);//把数据拷入数组。
 
我不是很清楚你们是用什么收发的,steve的程序好像是用了控件,应该可以的
如果直接用api的话
readfile就直接读到缓冲区里了(可以认为缓冲区就是数组)
 
var DestStr:array of char;
编译通不过。
 
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
DestStr:array of char;
begin
setlength(DestStr,BufferLength);//设置数组长度
copymemory(DestStr,Buffer,BufferLength);//把数据拷入数组。
end;

这段代码在我的机器上一点问题都没有,你是不是没有把NewLength 改成BufferLength?
 
steve:和你写的一模一样。
是var DestStr:array of char;通不过,是var DestStr:array[0..100] of char;
才行。
但这样定义的DestStr是数组,与下面函数中要求的指针类不付。
我用的是D3。
 
哦,有这等事?
我定义的也是数组啊,只不过是动态数组,考虑到你发送的
字符串不是定长的,才用动态数组,在程序中设定长度。
你看看帮助,D3中动态数组是如何使用的,然后按D3中例子
试一下(都二十一世纪了,怎么还用D3 :-D)
如果还不行的话,就用一个指针指向这个数组,其实按道理讲,
在Delphi中,数组类型就是一个指针。
如果仍旧不行,试试如下代码:
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
type
Tss = array[0..100] of byte;
Tpss = ^Tss;
var
ss:Tss;
pss:Tpss;
begin
// setlength(ss,BufferLength);
pss:=buffer;
ss:=pss^;
end;
 
呵呵,deststr 定义为pchar就行了。
 
多人接受答案了。
 

Similar threads

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