-1

DSP TMS32F28069 からセンサー値を受け取る Delphi 7 コードがあります。Delphi が受け取る値は、Hex ファイル データです。たとえば、データを送信します。

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

DSPから。

私はComport 411fを使用していますが、実際にWindows 10 64ビット英語版を使用すると、すべて問題ありません。しかし、windows 中国語 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);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 に答える