Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразование данных с COM порта, прием данных с COM порта 
:(
    Опции темы
SergeySamara
Дата 13.12.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.12.2009

Репутация: нет
Всего: нет



Уважаемые знатоки! Помогите пожалуйста в решении такой задачи.
Есть массив байт принятый с COM порта, данные передаются с микроконтроллера в следующем формате:
1). Zag -заголовок,  символ "F" в ASCII, длина 1 байт.
2). Status    тип - Iteger Byte, длина 1 байт.(0,1,2,3)
3). SP,    тип - Iteger Word, длина 2 байт.(0...50)
4). PV,    тип - Iteger Word, длина 2 байт.(-55...0...128)
5). Prop,    тип - Iteger Byte, длина 1 байт.(-100...0...100)
6). Intergal,    тип - Iteger Byte, длина 1 байт.(-100...0...100)
7). Diff,    тип - Iteger Byte, длина 1 байт.(-100...0...100)
8). PID_Out,    тип - Iteger Byte, длина 1 байт.(-100...0...100)
9). CCP1L,    тип - Iteger Byte, длина 1 байт.(0...100)
10). перевод каретки, тип - символ "#13" длина 1 байт.
Итого передается 12 байт.
Вопрос в следующем: какой тип массива (DataCom) мне использовать в функции чтения ReadFile(ComHandle, DataCom, 255, Count, nil),
и как собрать принятые байты SP1, SP2 в одну переменную SP, а так же как правильно сделать приведение остальных типов к типу Strig или Integer. Прошу не пинать ногами, т.к. на Delphi писал очень давно, а сейчас пишу в основном на MPASM. Преобразованные данные будут либо писаться в лог и может ещё заноситься в таблицу DBGrid для последующего построения графиков.
 Вот извращенный мною код, исходники которого я использовал с этого сайта.
Код

procedure ReadComm();
var i:Cardinal;
  DataCom: array[1..12] of Byte;
  SArray: array[1..12] of Byte;
  Count: Cardinal;
  SP, SP1, SP2, PV, PV1, PV2: Integer; //SP1, SP2 чтоб собрать SP.... аналогично и PV
  STATUS, Prop, Intg, Diff, PID_out, CCP1L: Integer;
  Zag : String;
  s:ShortString;
begin
  //setlength(s,8);
  ReadFile(ComHandle, DataCom, 255, Count, nil);
//  Zag  := ????????
  STATUS := PInteger(@DataCom[1])^;
  SP1    := PInteger(@DataCom[2])^;
  SP2    := PInteger(@DataCom[3])^;
  PV1    := PInteger(@DataCom[4])^;
  PV2    := PInteger(@DataCom[5])^;
  Prop   := PInteger(@DataCom[6])^;
  Intg   := PInteger(@DataCom[7])^;
  Diff   := PInteger(@DataCom[8])^;
  PID_out:= PInteger(@DataCom[9])^;
  CCP1L  := PInteger(@DataCom[10])^;

  s:=Zag+' '+inttohex(STATUS,2)+' '+inttohex(SP1,2)+' '+inttohex(SP2,2)+' '+inttohex(PV1,2)+' '+inttohex(PV1,2)+' '+inttohex(PV1,2)+' 

'+inttohex(Prop,2)
  +' '+inttohex(Intg,2)+' '+inttohex(Diff,2)+' '+inttohex(PID_out,2)+' '+inttohex(CCP1L,2);
  Form1.Memo1.Lines.Add(s);

end;



M
bartram
Не забываем использовать кнопочку "Код"


Это сообщение отредактировал(а) bartram - 13.12.2009, 19:37
PM MAIL   Вверх
~FoX~
Дата 13.12.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 0
Всего: 68



SergeySamara, Ой... Не сильно вникал, но имхо проще использовать не массив, а все таки структуру типа
Код

type
  RDataCom = record
    Zag: string[1];
    Status: integer;
    SP: integer;
    PV: integer;
    Prop: integer;
    Intergal: integer;
    Diff: integer;
    PID_Out: integer;
    CCP1L: Byte;
    PK: string[1];
end;

Дальше собираем массив структуры

Код

var
  DataCom: array[] of RDataCom;


Теоретически в него должно попасть то что выбирит ReadFile, если конечно структуры совпадают...


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SergeySamara
Дата 13.12.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.12.2009

Репутация: нет
Всего: нет



~Fox~ Спасибо! переписал под структуру, но все-таки вернусь в вопросу о том как собрать принятые байты SP1, SP2 в одну переменную SP, а так же как правильно сделать приведение остальных типов к типу Strig или Integer.

Это сообщение отредактировал(а) SergeySamara - 13.12.2009, 21:25
PM MAIL   Вверх
~FoX~
Дата 13.12.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 0
Всего: 68



SergeySamara, Зачем? В SP как и в PV попадет интеджер, не надо будет его побайтово собирать...


FloatToStr, IntToStr, StrToInt и еже сними...

Это сообщение отредактировал(а) ~FoX~ - 13.12.2009, 21:29


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
SergeySamara
Дата 13.12.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.12.2009

Репутация: нет
Всего: нет



дело в том что SP и PV передаются побайтово т.е. - привожу структуру принятых данных в HEX :
46   01        01               40             01                38          09      64   00 64 5A 0D
'F' /stat/1й байтSP/2й байтSP/1й байт PV/2й байт PV/Prop/  и т.д.
а вот как собрать 1й и 2 байт....
На всякий привожу код со структурой
Код

procedure ReadComm();
type
  RDataCom = record
    Zag: string[1];
    Status: integer;
    SP1: integer;
    SP2: integer;
    PV1: integer;
    PV2: integer;
    Prop: integer;
    Intergal: integer;
    Diff: integer;
    PID_Out: integer;
    CCP1L: Byte;
    PK: string[1];
end;
var
  DataCom: array[1..12] of RDataCom;
  Count: Cardinal;
  SP, SP1, SP2, PV, PV1, PV2: Integer;
  STATUS, Prop, Intg, Diff, PID_out, CCP1L: Integer;
  Zag : String;
  s:ShortString;
begin
  //setlength(s,8);
  ReadFile(ComHandle, DataCom, SizeBuf, Count, nil);
  Zag    := ???????
  STATUS := PInteger(@DataCom[1])^;
  SP1    := PInteger(@DataCom[2])^;
  SP2    := PInteger(@DataCom[3])^;
  PV1    := PInteger(@DataCom[4])^;
  PV2    := PInteger(@DataCom[5])^;
  Prop   := PInteger(@DataCom[6])^;
  Intg   := PInteger(@DataCom[7])^;
  Diff   := PInteger(@DataCom[8])^;
  PID_out:= PInteger(@DataCom[9])^;
  CCP1L  := PInteger(@DataCom[10])^;


PM MAIL   Вверх
Romikgy
Дата 16.12.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



мой вариант %)
Код

type
  RDataCom = record
    Zag: char;
    Status: byte;
    SP: word;
    PV: smallint;
    Prop: smallint;
    Intergal: smallint;
    Diff: smallint;
    PID_Out: smallint;
    CCP1L: Byte;
    PK: char;
end;

и вместо
Код

STATUS := PInteger(@DataCom[1])^;

юзать 
Код

STATUS := DataCom[1].Status;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SergeySamara
Дата 21.12.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.12.2009

Репутация: нет
Всего: нет



Спасибо большое всем ответившим. В общем разобрался, прога готова - друг, для которого это собственно писалось в восторге smile .
Привожу окончательный код, может кому пригодиться:
Код

procedure ReadComm();
type
  rec_SP = record
    case Val: word of
      0: (SP0, SP1: byte);
      1: (i1: word);
    end;
  rec_PV = record
    case Val: smallint of
      0: (PV0, PV1: Shortint);
      1: (i2: smallint);
    end;
  rec_ = record
    case Val: Shortint of
      0: (r0, r1, r2, r3, r4 : Shortint); // Status, Prop, Ingr, Diff, PID_Out , Status
      1: (i3: Shortint);
    end;
var
  DataCom: array[0..11] of Shortint;
  r5: Byte;
  r_SP:   rec_SP;
  r_PV:   rec_PV;
  r_  :   rec_;
  PV, SP : Smallint;
  Count: Cardinal;
  s, s_, PV_, SP_: String;
  t_sys: TSYSTEMTIME;
  Date_Time: TDateTime;
  time_str, Hour, Second :string;
begin


  ReadFile(ComHandle, DataCom, SizeBuf, Count, nil); // читаем из порта
  r_SP.SP0 := DataCom[3]; // переносим его в rec_SP, и меняем байты
  r_SP.SP1 := DataCom[2];
  r_PV.PV0 := DataCom[5]; // переносим его в rec_PV, и меняем байты
  r_PV.PV1 := DataCom[4];
  r_.r0 := DataCom[1];     //Status
  r_.r1 := DataCom[6];     //Prop
  r_.r2 := DataCom[7];     //Ingr
  r_.r3 := DataCom[8];     //Diff
  r_.r4 := DataCom[9];     //PID_Out
  r5 := DataCom[10];    //CCP1L

  PV_:=IntToStr(r_PV.i2);
  SP_:=IntToStr(r_SP.i1);

  PV:=StrToInt(PV_);
  SP:=StrToInt(SP_);

  GetLocalTime(t_sys);
  Hour:=IntToStr(t_sys.wHour);
  Second:=IntToStr(t_sys.wSecond);
//  Milliseconds:=IntToStr(lt.wMilliseconds);

  If Length(Hour)=1 Then
    Hour:='0'+Hour;
  If Length(Second)=1 Then
    Second:='0'+Second;
{  If Length(Milliseconds)=1 Then
    Milliseconds:='0'+Hour;}

  time_str:=( Hour +':'+ Second );

  s:=time_str+' '+Char(DataCom[0])+' STATUS='+ IntToStr(r_.r0)+' SP='+IntToStr(SP)+' PV='+IntToStr(PV)+' PROP='+ IntToStr(r_.r1)
  +' Ingr='+ IntToStr(r_.r2)+' Diff='+ IntToStr(r_.r3)+' PID_Out='+ IntToStr(r_.r4)+' CCP1L='+ IntToStr(r5);
  Form1.Memo1.Lines.Add(s);
  Form1.Table1.Insert;

  Form1.Table1.Fields.Fields[0].AsString:= time_str;
  Form1.Table1.Fields.Fields[1].AsInteger:= r_.r0;
  Form1.Table1.Fields.Fields[2].AsInteger:= SP;
  Form1.Table1.Fields.Fields[3].AsInteger:= PV;
  Form1.Table1.Fields.Fields[4].AsInteger:= r_.r1;
  Form1.Table1.Fields.Fields[5].AsInteger:= r_.r2;
  Form1.Table1.Fields.Fields[6].AsInteger:= r_.r3;
  Form1.Table1.Fields.Fields[7].AsInteger:= r_.r4;
  Form1.Table1.Fields.Fields[8].AsInteger:= r5;

  Form1.Table1.Post;

  s_:=Char(DataCom[0])+' STATUS='+ IntToHex(r_.r0,2)+' PV='+IntToHex(r_SP.i1,2)+' SP='+IntToHex(r_PV.i2,2)+' PROP='+ IntToHex(r_.r1,2)
  +' Ingr='+ IntToHex(r_.r2,2)+' '+inttohex(r_.r2,2)+' Diff='+ IntToHex(r_.r3,2)+' PID_Out='
  + IntToHex(r_.r4,2)+' CCP1L='+ IntToHex(r5,2);


end;



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.