求助:关于CPort串口通信的问题

春风老少年 2012-09-10 12:27:51
用D7写了个串口通信的上位机,串口控件用的是CPort,遇到个非常奇怪的问题,我用了两种方法来解决,得到了两种不同的结果。
方法一,只有一个单元文件:

function StrToHexStr(const Str:string):string;
var i:Integer;
begin
for i:=1 to Length(Str) do
begin
if i=1 then
Result:= IntToHex(Ord(Str[1]), 2)
else Result:= Result+ #32+ IntToHex(Ord(Str[i]), 2);
end;
end;

//串口收数过程
procedure TwMain.CPortRxChar(Sender: TObject; Count: Integer);
var strGet: String;
begin
CPort.ReadStr(strGet, count);
memo1.Text:= StrToHexstr(strGet);
end;


方法二,有两个单元文件:

//unit2.pas单元中定义:
//全局变量:
var DataGet: Array of Byte;

//然后定义过程:
procedure SaveData(const Data: Array of Byte);
var i: Integer;
begin
SetLength(DataGet, Length(Data));
for i:= 0 to Length(DataGet)-1 do
DataGet[i]:= Data[i];
end;

function Show(): String;
var i: Integer;
begin
for i:= 0 to Length(DataGet) do
begin
if i= 0 then
Result:= IntToHex(DataGet[0], 2)
else Result:= Result+ #32+ IntToHex(DataGet[i], 2);
end;
end;

//unit1.pas单元中定义,已引用uint2.pas
//串口收数过程
procedure TwMain.CPortRxChar(Sender: TObject; Count: Integer);
var
strGet: String;
i: Integer;
CommData: Array of Byte;
begin
CPort.ReadStr(strGet, count);

SetLength(CommData, Length(strGet));
for i:= 0 to Length(strGet)-1 do
CommData[i]:= Ord(strGet[i+1]);

SaveData(CommData);
memo1.Text:= Show();
end;


用方法一,串口收到的数据显示正确,用方法二就不对。具体错误表现,据我观察,似乎memo中显示的数据为串口收到的数据(字符串StrGet,转存到全局数组变量DataGet中)的最后3个(有时变成2个)字节加上数组DataGet后的未知内存空间中的的一定长度的字节。但是显示的长度和我定义的要显示的DataGet数组的长度又不一样,比如StrGet字符串长度为28,那么memo中显示的数据是DataGet的最后三个字节,然后加上其后未知内存空间中的26个字节,显示的长度比定义的长度多了一个字节。请问这是怎么回事?
需要解决的问题:
我现在想用方法二来显示串口收到的数据,中间变量数组DataGet必须有,因为要根据DataGet中各个数组元素的二进制值的0、1位状态来表示机器相应功能的运行状态,所以只能用方法二。但是搞了半天,串口数据就是显示不正确,好像调用是SaveData函数存储的时候,数据发生了变化,不知道究竟是怎么回事,求各位Delphi高手速速相助!
谢谢!!!
...全文
276 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
春风老少年 2012-09-15
  • 打赏
  • 举报
回复
难道没有人来帮忙了吗?
这个问题如此之难???
春风老少年 2012-09-10
  • 打赏
  • 举报
回复
谢谢楼上,那个循环里的length(DataGet)-1是我发帖的时候没注意,少写了,源程序没写错。
我CPORT发送数据用的是WirteAsync函数,发送的字符串,接收用的ReadStr,也是字符串。
用方法一显示就没有问题,我现在就是不知道方法二究竟错在什么地方。
春风老少年 2012-09-10
  • 打赏
  • 举报
回复
又写错了,CPORT发送数据用的是WirteStrAsync函数
看那山瞧那水 2012-09-10
  • 打赏
  • 举报
回复
function Show(): String;
var i: Integer;
begin
for i:= 0 to Length(DataGet) do
begin
if i= 0 then
Result:= IntToHex(DataGet[0], 2)
else Result:= Result+ #32+ IntToHex(DataGet[i], 2);
end;
end;

这里的 for i:=0 to length(dataget)-1 do

和下位机通信,用ReadStr()函数?还是用read()函数吧,然后数据自己来处理。
春风老少年 2012-09-10
  • 打赏
  • 举报
回复
顶一下,求助!

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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