2016-11-23 8 views
-1

У меня есть код Delphi 7, который принимает значения датчиков от DSP TMS32F28069. Значение, полученное Delphi, это данные файла Hex. Например, я отправить данные:Пропущенные данные, полученные с использованием Serial comport 411f delphi 7

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

из ДСП.

Я использую Comport 411f, и на самом деле, когда я использую Windows 10 64-битную английскую версию, все в порядке. Но когда я использую 64-битные окна Windows, данные, которые иногда получаются, иногда меняются. Я попробовал несколько ноутбуков с использованием Windows 7 64-битной китайской версии, и у нее такая же проблема. Полученные файлы на окна 7 64 бит китайская версия, демонстрирующая:

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

и всегда change.This код, который я написал в 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-битную английскую версию, она также отлично работает.

Спасибо

+0

Параметр 'ComPort1RxChar' имеет' count' вход. Это количество полученных байтов. Вы должны использовать это, чтобы заполнить буфер, который является глобальным по объему, и как только все байты будут получены, вы должны интерпретировать полное сообщение. –

+0

Есть ли у вас какой-нибудь пример кода? я бы хотел попробовать. Спасибо. –

+0

Вы также обновляете записку внутри цикла, что немного бессмысленно. Обновите его один раз, когда сообщение будет завершено. –

ответ

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 
+0

Привет, Mbo, Могли бы вы также опубликовать функцию TreatData, я бы хотел попробовать. Извините, потому что я новичок. Спасибо. –

+0

Привет, Mbo, я использую ваш код и его работу прямо сейчас. Спасибо Вам большое за вашу помощь. –