发送十六进制接收数据的问题?

lythink 2004-12-17 09:54:15
我发$02FF ,所接收到数据如下:
(打开串口第一次接收到的数据)
(第二次)
(第三次)
(第四次)
(...)
(...)
(...)
02FF02FF16(第N次,以十六进制显示的数据)
02FF02FF16(N+1次,16进制显示的数据)
//发送数据函数的代码
procedure TTest.SendClick(Sender: TObject);
var
FSd:string;
begin
cdata:=FSChar.Text;
hdata:=FSHex.Text;
if HexSend.Checked then //以16进制发送
begin
FSd:=hdata+cdata;
SendHex(FSd);
end else
begin
SendHex(hdata);
comm1.WriteCommData(PCHar(cdata),length(cdata));
end;
end;
//接收数据
procedure TTest.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
Data,s:string;
C:Char;
JSd:array of char;
i:integer;
begin
s:='';
if HexGet.Checked then //接收区以16进制显示
begin
setlength(JSd,BufferLength);
move(Buffer^,PChar(JSd)^,BufferLength);
for i:=0 to BufferLength do
begin
C :=JSd[i];
s:=s+inttohex(byte(C),2);
end;
JSData.Lines.Add(s);
end else
begin
setlength(Data,BufferLength);
move(Buffer^,PChar(Data)^,BufferLength);
JSData.Lines.Add(Data);
end;
end;
//发送16进制数据
procedure TTest.SendHex(s: String);
var
s2:string;
buf:array[0..50000] of byte;
i:integer;
begin
s2:='';
for i:=1 to length(s) do
begin
if ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))
or((copy(s,i,1)>='a') and (copy(s,i,1)<='f'))
or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
begin
s2:=s2+copy(s,i,1);
end;
end;
for i:=0 to (length(s2) div 2-1) do
begin
buf[i]:=strtoint('$'+copy(s2,i*2+1,2));
comm1.WriteCommData(@buf,(length(s2) div 2));
end;
end;
帮我看看啊,如果第一次是正确的,那影响我的第二次另外发的一个数据啊,我要做握手通信啊!
...全文
407 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lythink 2004-12-25
  • 打赏
  • 举报
回复
呵呵

好了
谢谢大家,我现在只要发偶数就可以了,在此干分感谢你们。
dzt1 2004-12-23
  • 打赏
  • 举报
回复
每次发送只要你调用就可以了,实践已经证明了
dzt1 2004-12-23
  • 打赏
  • 举报
回复
我提供给你一个发送的函数看看估计对你有用:
function SENDMSGcomm(comm1:Tcomm;msgs:PCHAR;Memo1:TMemo): Boolean;//
VAR A:ARRAY OF BYTE;
FLAG:BOOLEAN;
I:BYTE;
begin
FLAG:=true;
//不管内部发送如何,只需填写字符串即可完成需要
SETLENGTH(A,5); //给数组分配长度为5个字节 单元
for i:=0 to 4 do
begin
A[i]:=STRTOINT('$'+msgS[I*2]+msgS[I*2+1]); //string[1..len] pchar[0..len]
end;

FLAG:=TRUE;
FOR I:=0 TO 4 DO
BEGIN
if Not Comm1.WriteCommData(@A[i],1) then
BEGIN
memo1.lines.add('串口未打开,发送失败!');
FLAG:=FALSE;
BREAK;
END;
END;
result:=flag;
memo1.lines.add('成功发送:'+msgs+' 命令!');
end;
lythink 2004-12-23
  • 打赏
  • 举报
回复
我是有点怀疑是SENDHEX()有问题,但是怎么改都不行的啊。哎
我是用的SPCOMM控件。我的这些OUTX。。INTX都是FLASE啊。
你们能不能帮我看看,我可以把源代码发给你们啊。现在急啊,也不知道是哪里的原因啊
lythink 2004-12-23
  • 打赏
  • 举报
回复
长度加1,不是吧,是偶数和奇数的差别啊
石榴刺猬 2004-12-23
  • 打赏
  • 举报
回复
如上的问题,你把长度加1如何?试试看
石榴刺猬 2004-12-23
  • 打赏
  • 举报
回复
查看一下相关的协议资料?可能是数据的长度设置有问题
lythink 2004-12-23
  • 打赏
  • 举报
回复
comm1.WriteCommData(@buf,(length(s2) div 2));
改为comm1.WriteCommData(@buf[i],1)
现在可以了,但是只能发偶数据位的数据,如发1位什么也收不到。发3位数据只能收到前面2个数据。发5位就只能收到4位数据,以此下。。。。
lythink 2004-12-22
  • 打赏
  • 举报
回复
怎么没有人回答啊。。
pchaos 2004-12-22
  • 打赏
  • 举报
回复
是不是SendHex(s: String)函数的问题?
你跟踪一下
zengyi81 2004-12-22
  • 打赏
  • 举报
回复
你用的是SPCOMM控件吗,你改一下这个属性outx_xonxofff改成FALSE
lythink 2004-12-17
  • 打赏
  • 举报
回复
我刚刚又测试了一下,发$FF,接收显示FF00
发$3FF-->3F00
$03FF-->03FF03FF78
$03FF03FF-->03FF03FF03FF03FF03FF03FF03FF03FF88
$000003FFFFFF-->000003FFFFFF000003FFFFFF000003FFFFFF000003FFFFFF000003FFFFFF000003FFFFFFF0
我也检查不出来什么原因,但是感觉是16进制发送的函数有错,那位高手帮我看看改一下啊!
lythink 2004-12-17
  • 打赏
  • 举报
回复
我发$02FF ,所接收到数据如下:
(打开串口第一次接收到的数据)
(第二次)
(第三次)
(第四次)
(...)
(...)
(...)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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