procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); var rbuf :array[0..10000] of byte; ReceStr,ViewStr:String; begin timer1.Enabled:=false; mmo1.Lines.Add('接收到来自'+comm1.CommName+'信息' ) ; ZeroMemory(pchar(@rbuf),10000); Move(buffer^,pchar(@rbuf)^,bufferlength); for i:=0 to bufferlength-1 do ReceStr:=ReceStr+chr(rbuf[i]); // for i :=0 to 10 do // ViewStr:='接收'+char(rbuf[i]); ViewStr:='接收'; // mmo1.Lines.Add('接收到:'); mmo1.Lines.Add((recestr)) ; //MoInfo.lines.ADD(ViewStr); end;
呵,顺便回复一下:)这跟波特率有关 一般情况下,发送过来的字符都会有结束位的,你可以检查当前接收到的数据中是否有该字符来确定数据是否接收完毕。实现代码如下:var S: string; //全局proc 响应串口事件 var S1: string begin ReadBuffer(S1); S := S + S1; if Pos('结束符', S1) = 0 then begin 接收完毕,S中的值即为最终的结果。 end; end;我不知道是否有描述清楚,还是没有理解你的意思刚又看了一下你的问题,你说能不能一次接收完?这是不可能的,除非调整波特率。
BufferLength: Word);
var rbuf :array[0..10000] of byte;
ReceStr,ViewStr:String;
begin
timer1.Enabled:=false;
mmo1.Lines.Add('接收到来自'+comm1.CommName+'信息' ) ;
ZeroMemory(pchar(@rbuf),10000);
Move(buffer^,pchar(@rbuf)^,bufferlength);
for i:=0 to bufferlength-1 do
ReceStr:=ReceStr+chr(rbuf[i]);
// for i :=0 to 10 do
// ViewStr:='接收'+char(rbuf[i]);
ViewStr:='接收';
// mmo1.Lines.Add('接收到:');
mmo1.Lines.Add((recestr)) ;
//MoInfo.lines.ADD(ViewStr);
end;
window的Socket默认缓冲区是4096,如果一次发送超过4096字节,可能导致
数据丢失或异常出现。通常的解决方法是把数据分块发送,而且每块不超过
4096字节,并加以同步控制。如:A 发送方;B 接收方
开始:A发一个字节通知B开始收发。(可省略)
发送(循环):A发送4000字节到B-----------B确认后通知A继续发送(可发送一个字节表示)-|
|--------------------------------------------------------------------|
结束:A发一个字节通知B结束,双方断开Socket连接。
一般情况下,发送过来的字符都会有结束位的,你可以检查当前接收到的数据中是否有该字符来确定数据是否接收完毕。实现代码如下:var
S: string; //全局proc 响应串口事件
var
S1: string
begin
ReadBuffer(S1);
S := S + S1;
if Pos('结束符', S1) = 0 then
begin
接收完毕,S中的值即为最终的结果。
end; end;我不知道是否有描述清楚,还是没有理解你的意思刚又看了一下你的问题,你说能不能一次接收完?这是不可能的,除非调整波特率。