-1

我有一个 Delphi 7 代码,它从 DSP TMS32F28069 接收传感器值。Delphi接收到的值是Hex文件数据。例如我发送数据:

F1;01;01;07;00;00;0A;00;00;00;00;F7

来自 DSP。

我使用 Comport 411f,实际上当我使用 Windows 10 64 位英文版时,一切都很好。但是当我使用windows chinese 64位时,有时接收到的数据有时会发生变化。我在几个使用windows 7 64位中文版的笔记本上试了试,都出现了同样的问题。windows 7 64位中文版接收到的文件显示:

F1;01;01;01;00;00;00;F7;00;00;F7;00. 或 F1;01;07;01;00;0A;00;00;F7;F7;00;00

并且总是改变。这是我在 Delphi 7 中编写的代码:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
p:integer;
r:array[1..12]of integer;
h:array[1..12]of String;
 begin
   comport1.Open;
  for p:=1 to 12 do
   begin
     comport1.Read(r[p],1);
     h[p]:= IntToHex((r[p]),2);
     sMemo3.Text:=   h[1]+';'+h[2]+';'+h[3]+';'+h[4]+';'+h[5]+';'+h[6]+';'+h[7]+';'+h[8]+';'+h[9]+';'+h[10]+';'+h[11]+';'+h[12];//Show data Receive on Memo4//
    end;
end;

请给我任何建议,为什么会在 Windows 7 64 位中文版上发生这种情况?因为当我使用 Windows 7 64 位英文版时,它也可以正常工作。

谢谢

4

1 回答 1

1
  1. 删除comport1.Open- 如果发生 RxChar 事件,无疑会打开

  2. 本地整数数组充满了一些废话。 comport1.Read(r[p],1);只填充一个字节。所以使用字节数组

  3. 您在每个字节后输出完整的数据数组 - 这是一种奇怪的方法。

  4. 当事件触发时,端口缓冲区包含Count字节 - 所以读取实际字节数。更好的方法 - 在全局数组(或)中累积接收到的信息,ansistring并在接收到 12 个字节时对其进行处理。


Buffer: AnsiString;
...

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  sa: AnsiString;
  ByteBuf: array[1..12] of Byte;
begin
   SetLength(sa, Count);
   comport1.Read(sa[1], Count);
   Buffer := Buffer + sa;
   while Length(Buffer) >= 12 do begin
      Move(Buffer[1], ByteBuf, 12); 
      TreatData(ByteBuf);
      Delete(Buffer, 1, 12);
   end;
 end;

 procedure TreatData(bb: array of Byte);
 //treat and output here 
于 2016-11-23T07:46:34.493 回答