串口通信问题,碰到字节 $00 就停止接收字符了???(100分)

  • 主题发起人 主题发起人 lizhi79
  • 开始时间 开始时间
L

lizhi79

Unregistered / Unconfirmed
GUEST, unregistred user!
function TComm.BytesInInQue:DWord;
var
stat:TCOMSTAT;
errs:DWord;
begin
ClearCommError(hCommFile,errs,@stat);
Result:=stat.cbInQue;
end;
//读数据
function Tcomm.ReadData(pBuffer:pChar;BufferSize:DWord):boolean;
var
nRead:DWord;
begin
Result:=ReadFile(hCommFile,pBuffer^,BufferSize,nRead,Nil);
end;
//写数据
function TComm.WriteData(pDataToWrite:PChar;dwSizeofDataToWrite:DWord):boolean;
var
nSent:DWord;
begin
Result:=WriteFile(hCommFile,pDataToWrite^,dwSizeofDataToWrite,nSent,Nil);
end;
读线程
procedure TCheckThread.Execute;
var
TempByte:Byte;
begin
while bCheckThread do
begin
//如果输入队列中有数据,读入并在队列中显示出来
if (frmPCDownload.TestComm<>Nil) and (frmPCDownload.TestComm.BytesInInQue>=1) then
begin
frmPCDownload.TestComm.ReadData(@TempByte,1);
TempString:=TempString+Chr(TempByte);
end;
if TempString=chr($23)+chr($AA)+chr($23)+chr($75) then //接收到PC联机信号
begin
TempString:='';
frmPCDownload.TestComm.WriteData(chr($23)+chr($55)+chr($23)+chr($7A),4); //发送联机应答
end;
end;
end;

发送接收都一切正常,但是如果碰到字节 $00 就会停止接收,但是在传输过程中的备用字符就是用 $00 表示的,请问该如何解决?
 
是字符串被 #0 截断了吗?
 
可能是吧,该怎么解决?
 
//考虑把nRead返回去,然后根据nRead的值处理pBuffer,这样就可以避免
//PChar类型是以#0标记结束的问题了
Result:=ReadFile(hCommFile,pBuffer^,BufferSize,nRead,Nil);
 
使用SPCOMM控件呀 !!!
我给你一端代码把;
下面是我写的一段向串口超市的客户显示牌发送数据的例子:
if Length(Content)<12 then
begin
Comm1:=TComm.Create(Application);
Comm1.StopComm;
Comm1.CommName:=Com;
Comm1.StartComm;
Comm1.BaudRate:=9600;
Comm1.Parity:=None;
Comm1.ByteSize:=_8;
Comm1.StopBits:=_1;
ShowStr:=chr(27)+chr(81)+chr(65)+Content+chr(13);
Sleep(5);
Send:=Comm1.WriteCommData(Pchar(ShowStr),Length(ShowStr));
if Send=false then
begin
Application.MessageBox('显示时出现错误,请检查','错误',MB_OK or MB_ICONERROR);
Comm1.StopComm;
Result:=false;
end;
end
else
begin
Application.MessageBox('您输入的字符长度超过11位','错误',MB_OK or MB_ICONERROR);
Result:=false;
end;
Comm1.StopComm;
Result:=true;
 
》但是如果碰到字节 $00 就会停止接收,
确切的说应该是收不到吧,需确保TDCB的fNull的值为0,即
dcb.Flags := dcb.Flags and $FFFFF7FF;

 
pchar是以#0结尾的
 
而我用spcomm控件写的程序,在接收是$13读不出来。不知道为什么?但是用串口调试工具可以
 
在使用SPCOMM时,需要手工设置部份属性:
1.IgnoreNullChar:=False; 否则遇到#0就被忽略了
2.Inx_XonXoffFlow:=False;
Outx_XonXoffFlow:=False; 否则遇到#19和#17都会不接收
其它属性也要根据硬件作适当调整

另外,发送端如用pchar(),会自动截断#0后的内容
 
因为,不管是C还是Pascal,都是地遇到0x00,#0就认为是结束了。你可以用指针指向pBuffer,然后跟据BufferSize的个数直接取出(不能用字符串拷贝),就行了。
 
后退
顶部