串口通信接受数据问题 ( 积分: 50 )

  • 主题发起人 主题发起人 uiit
  • 开始时间 开始时间
U

uiit

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TArrOriData = Array of Byte;
end;

Function TForm1.WriteStr(StrArr : Array of Byte):Boolean; //发送数据
var
DwCharsWritten,DwRes:Dword;
BRes:boolean;

Begin
BRes:=False;

if hcom<>INVALID_HANDLE_VALUE then
begin
DwCharsWritten:=0;
BRes:=WriteFile(Hcom,StrArr,5,
DwCharsWritten,LpolW); //返回True,数据立即发送完成
if not BRes then
begin
if GetLastError()=Error_IO_Pending then
begin //正在发送数据
DwRes:=WaitForSingleObject(LpolW^.hEvent,Infinite);
if DwRes=Wait_Object_0 then // 如果不相等,出错
BRes:=GetOverLappedResult(hcom,LpolW^,DwCharsWritten,False) //返回False,出错
else BRes:=true; //数据发送完成
end;
end;
end;
Result:=Bres;
end;
Procedure TForm1.MsgComm(Var Msg:Tmessage); //接收数据
var
clear:boolean;
coms:TComStat;
cbNum,Cbread,lpErrors:Dword;
i : integer;
s : Array[0..4] of Byte;// ofTArrOriData;
str : String;
begin
clear:=clearCommerror(hcom,lperrors,@Coms);
if clear then
begin

cbnum:=Coms.cbInQue; //获取接收缓冲区待接收字节数
//
// setlength(s,cbnum); //分配内存
ReadFile(hcom,s,cbnum,Cbread,LpolR); //读串口
// ShowMessage(IntToStr(Cbnum));
// ShowMessage(IntToStr(Cbread));
// setlength(str,1); //分配
// setLength(s, cbread);
SetEvent(Post_Event); //同步事件置位
str := '';
for i :=0 to 4 do
begin
str := str + intToHex(s,2);
end;
Memo1.Lines.Add(str);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j : integer;
Data : TOriginalData; //记录类型,里面是取得的数据
OriData : TArrOriData; // 自定义的一个动态byte数组类型
ArrData : Array[0..4] of Byte;
begin
ExactDataGenerate(Data); // 取得数据data
OriEditDataPack(Data, OriData); // 解成OriData类型
for i := 0 to 4 do
begin
ArrData := OriData; //赋给arrdata,以便发送
end;
If not WriteStr(ArrData) then ShowMessage('无法发送数据')
else ShowMessage('发送成功');
end;

问题是:我以byte发送,但是收到数据时,我昨天看正常!今天改了一下数据
发现只要大于127 也就是最高位为1时,接受数据时,都把它置为了0;

也就是当你发送255($FF),200($C8),188($BC),128($80),177($B1)时
收到为 $7F,$48,$3C,$00,$31
问题2:偶尔还会出现接受多余数据,前面是应该接受的正确数据,后面跟同样长度
若干不知哪里来的数据;

请大家帮帮忙,明天老板就要要了,通信方面不知道没搞过,不知怎么回事
分数可以另开,再加
 
type
TArrOriData = Array of Byte;
end;

Function TForm1.WriteStr(StrArr : Array of Byte):Boolean; //发送数据
var
DwCharsWritten,DwRes:Dword;
BRes:boolean;

Begin
BRes:=False;

if hcom<>INVALID_HANDLE_VALUE then
begin
DwCharsWritten:=0;
BRes:=WriteFile(Hcom,StrArr,5,
DwCharsWritten,LpolW); //返回True,数据立即发送完成
if not BRes then
begin
if GetLastError()=Error_IO_Pending then
begin //正在发送数据
DwRes:=WaitForSingleObject(LpolW^.hEvent,Infinite);
if DwRes=Wait_Object_0 then // 如果不相等,出错
BRes:=GetOverLappedResult(hcom,LpolW^,DwCharsWritten,False) //返回False,出错
else BRes:=true; //数据发送完成
end;
end;
end;
Result:=Bres;
end;
Procedure TForm1.MsgComm(Var Msg:Tmessage); //接收数据
var
clear:boolean;
coms:TComStat;
cbNum,Cbread,lpErrors:Dword;
i : integer;
s : Array[0..4] of Byte;// ofTArrOriData;
str : String;
begin
clear:=clearCommerror(hcom,lperrors,@Coms);
if clear then
begin

cbnum:=Coms.cbInQue; //获取接收缓冲区待接收字节数
//
// setlength(s,cbnum); //分配内存
ReadFile(hcom,s,cbnum,Cbread,LpolR); //读串口
// ShowMessage(IntToStr(Cbnum));
// ShowMessage(IntToStr(Cbread));
// setlength(str,1); //分配
// setLength(s, cbread);
SetEvent(Post_Event); //同步事件置位
str := '';
for i :=0 to 4 do
begin
str := str + intToHex(s,2);
end;
Memo1.Lines.Add(str);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j : integer;
Data : TOriginalData; //记录类型,里面是取得的数据
OriData : TArrOriData; // 自定义的一个动态byte数组类型
ArrData : Array[0..4] of Byte;
begin
ExactDataGenerate(Data); // 取得数据data
OriEditDataPack(Data, OriData); // 解成OriData类型
for i := 0 to 4 do
begin
ArrData := OriData; //赋给arrdata,以便发送
end;
If not WriteStr(ArrData) then ShowMessage('无法发送数据')
else ShowMessage('发送成功');
end;

问题是:我以byte发送,但是收到数据时,我昨天看正常!今天改了一下数据
发现只要大于127 也就是最高位为1时,接受数据时,都把它置为了0;

也就是当你发送255($FF),200($C8),188($BC),128($80),177($B1)时
收到为 $7F,$48,$3C,$00,$31
问题2:偶尔还会出现接受多余数据,前面是应该接受的正确数据,后面跟同样长度
若干不知哪里来的数据;

请大家帮帮忙,明天老板就要要了,通信方面不知道没搞过,不知怎么回事
分数可以另开,再加
 
用Tcomm控件!
tcomm事件中的onReceiveData事件中
procedure Tfrm_sms.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var sa: PChar;
begin
GetMem(sa, BufferLength);
try
Move(Buffer^, Sa^, BufferLength);
Memo1.Lines.Add(Sa);
finally
FreeMem(sa);
end;
end;
 
>> yina 兄
我没有装控件阿
这个串口通信部分我都是用api的
还有我按字符是对的
现在用按byte发送,为使单片机解包数据时方便
能不能指出我问题所在阿?
 
你看看StrArr这个变量类型,可能是这个变量的问题。写串口函数应该没问题。
 
to gao_ad:
那个变量不过是个数组而已阿
而且我看了传入数据strArr,传入正确阿
主要是消息出发读取问题可能是,但我找不到原因
还有那个clearcommerror会执行两次
说明消息触发了2次但我不知什么原因会使它这样啊
 
你还是装控件吧,很简单的,呵呵!
 
to scy_fjqz:
谢谢
我怕来不及阿,还要找控件,再使用,代码里面好多地方要找啊
过了这次我一定去找个控件装上
 
高手大虾们开帮帮忙哦
分数可以开贴再给
 
没有看出哪里出了问题,但还是介意用控件比较方便;
我用SPCOMM
 
to dongy_143:
谢谢
时间不多,我想解决问题比再去换控件快一点,所以....
多顶起
 
我把第二个问题暂时解决了
帮帮我第一个问题大家
谢谢
 
再顶一次嘎
急疯了
 
你把接收数据的那个固定数组s改成:
S:Array of Byte;// ofTArrOriData;试一下
 
不行的,那样问题更大
问题在读,不在写
 
建议接收数据时,先读串口,在动态分配内存。
LpolR: Toverlapped;
Procedure TForm1.MsgComm(Var Msg:Tmessage); //接收数据
var
clear:boolean;
coms:TComStat;
cbNum,Cbread,lpErrors:Dword;
i: integer;
s: Array of Byte
str : String;
begin
clear:=clearCommerror(hcom,lperrors,@Coms);
if clear then begin
cbnum:=Coms.cbInQue; //获取接收缓冲区待接收字节数
if cbnum>0 then begin
fillchar(s,Coms.cbInQue,#0);
if (not ReadFile(hcom,s,Coms.cbInQue, Cbread,@LpolR)) then begin
ErrorFlag := GetLastError();
if (ErrorFlag <> 0) and (ErrorFlag <> ERROR_IO_PENDING) then begin
MessageBox(0,'ReadFile Error!','Notice',MB_OK);
CloseHandle(Post_Event);
CloseHandle(LpolR.hEvent);
CloseHandle(hcom);
Exit;
end else begin
WaitForSingleObject(hcom,INFINITE);
GetOverlappedResult(hcom,LpolR,Cbread,False);
end;
end;
str:='';
if Cbread>0 then begin
SetLength(s,Coms.cbInQue);
for k:=0 to Coms.cbInQue-1 do begin
s[k]:=InputBuffer[k];
str:=str+' '+ inttostr(InputBuffer[k]); //也可转换成16进制
end;
end;
Memo1.Lines.Add(str);
end;
SetEvent(Post_Event);
end;
只是针对你的程序改了改,我没有试。不知道是否对你有所帮助。
 
to HopeStar:
inttostr(InputBuffer[k]);
想请教一下你在这里InputBuffer的什么意思
我觉得是不是多余
 
就是你的 S
 
数组问题
你不信可以用下的绝对是对的
VAR
strarr:array[0..4] of byte;
begin
strarr[0]:=$FF;
strarr[1]:=$C8;
....
WriteFile(Hcom,StrArr,5,
DwCharsWritten,LpolW);
 
to hopestar:
明白,谢谢,现在已经本能确定是读数组地址这里的问题
但还是不知道何处原因...
to 41426277 :
不是的,我刚试不行,其实以前我试的也是对的
今天我只是乱改了一下数据就发生这种情况了
 

Similar threads

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