U
uiit
Unregistered / Unconfirmed
GUEST, unregistred user!
type
TArrOriData = Array of Byte;
end;
Function TForm1.WriteStr(StrArr : Array of Byte):Boolean; //发送数据
var
DwCharsWritten,DwResword;
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,lpErrorsword;
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:偶尔还会出现接受多余数据,前面是应该接受的正确数据,后面跟同样长度
若干不知哪里来的数据;
请大家帮帮忙,明天老板就要要了,通信方面不知道没搞过,不知怎么回事
分数可以另开,再加
TArrOriData = Array of Byte;
end;
Function TForm1.WriteStr(StrArr : Array of Byte):Boolean; //发送数据
var
DwCharsWritten,DwResword;
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,lpErrorsword;
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:偶尔还会出现接受多余数据,前面是应该接受的正确数据,后面跟同样长度
若干不知哪里来的数据;
请大家帮帮忙,明天老板就要要了,通信方面不知道没搞过,不知怎么回事
分数可以另开,再加