Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2013, 15:35   #1
qwertyui123
 
Регистрация: 19.08.2013
Сообщений: 8
По умолчанию Обмен данными с устройством через Com port

Добрый день.
Впервые столкнулся с задачкой программирования устройства и не могу до конца понять пару вещей.
Скачал компонент BComPort, разобрался как идет отправка и получение простых данных (строковой переменной, числовой).
Вопрос в следующем:
Как сформировать пакет данных и анализировать ответный пакет от устройства по смещениям
Формат пакета для отправки
Смещение Тип
00 byte
01 byte
02 byte
03 byte
04 byte
05 byte
06 word
08 word
0A word
0C word
0E word
80 word
FE word


Формат пакета приема
Смещение Тип
00 word
02 word
04 word
7E word
qwertyui123 вне форума Ответить с цитированием
Старый 07.09.2013, 16:04   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Как сформировать пакет данных и анализировать ответный пакет от устройства по смещениям
Не верю, что так в документации, к устройству, написано.
Человек_Борща вне форума Ответить с цитированием
Старый 07.09.2013, 16:31   #3
qwertyui123
 
Регистрация: 19.08.2013
Сообщений: 8
По умолчанию

устройство самодельное,
забыл написать, размер пакета 256 байт
qwertyui123 вне форума Ответить с цитированием
Старый 07.09.2013, 16:35   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...ну, почему же, описанием нахождения данных по смещению относительно базового адреса страдает, к примеру, Fastwell и многие другие производители. К тому же, это удобно.

OFFTOP >
...для UNIOxx-5, дабы не быть голословным.

TC, в вашем случае тип данных указывает на их размерность. Если данные следуют друг за другом в пакете, то зная размерность каждой позиции можно узнать конкретное значение (byte - 1 байт, word - два байта). Если указано смещение $7e после $4, это значит что с $6 по $7e следует поле соответствующей размерности.

Однако, Человек_Борща верно отметил. Мы тут не гадалки, если задаете вопрос по железу и протоколам - наименование прибора и ссылку на мануалы в тему.

Цитата:
устройство самодельное,
значит ссылку на описание самодельного или исходный код.


Пример побайтного анализа:
Код:
type tb = array[1..255] of Char;  //Определяем символьный массив
     pb = ^tb;
procedure TForm1.rec(Sender:TObject; Buffer: pointer; BufferLength: Word);
var PX : pb;
    i, temp: integer;
    str: string;
    state: word;
    //
    card_serial, card_numer: integer; // серия и номер карточки
begin
 //Memo1.Clear;
 PX:= buffer; str:='';

 // ЛОГГИРОВАНИЕ ===============
 for i:= 1 to BufferLength do begin
  str:= str +inttohex(ord(PX^[i]), 2) + ' ';
 end; Memo1.Lines.Add(str);

 // РАЗБОР КОДОГРАММЫ ======

 // ловим ответ с порта о готовности считывателя +
 // кода карточки, если предъявлена
 // F2 FF (K) F0 (State - состояние считывателя) (Тип считывателя 00 или 01) (Длина кода=один байт) (CR, n-байт кода предъявленной карточки) (один байт=СRC всех байт пакета-1 по исключающему ИЛИ, начиная с 3-го байта)
 // Реальный пример пакета - вставлена карта:
 // F2 FF 08 F0 80 00 1A ED 04 D0 01
 // Реальный пример пакета - отсутствует карта:
 // F2 FF 04 F0 00

 i:= 2;
 while i < BufferLength do begin
  if ord(PX^[i]) = $08 then begin
   card_numer:= (ord(PX^[i + 5]) shr $1) + (ord(PX^[i + 6]) and $01)* 128;
   temp:= (ord(PX^[i + 6]) shr $1) + (ord(PX^[i + 7]) and $01) * 128;

   card_numer:= card_numer + temp * 256;
   card_serial:= (ord(PX^[i + 7]) shr $1) + (ord(PX^[i + 8]) and $01) * 128;
  end;
  i:= i + 8
 end;
...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 07.09.2013 в 16:38.
raxp вне форума Ответить с цитированием
Старый 07.09.2013, 17:07   #5
qwertyui123
 
Регистрация: 19.08.2013
Сообщений: 8
По умолчанию

все что дали это формат обмена пакетами, микроконтроллер напишу попозже

Последний раз редактировалось qwertyui123; 07.09.2013 в 17:11.
qwertyui123 вне форума Ответить с цитированием
Старый 07.09.2013, 17:28   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Замечу, что вы уже можете приступить к формированию и разбору пакетов.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 07.09.2013, 18:14   #7
qwertyui123
 
Регистрация: 19.08.2013
Сообщений: 8
По умолчанию

я так и не могу понять, как из моих 15 переменных сформировать в пакет данных
и затем полученный ответный пакет раскидать по переменным исходя из этих смещений
qwertyui123 вне форума Ответить с цитированием
Старый 07.09.2013, 19:03   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
я так и не могу понять, как из моих 15 переменных сформировать в пакет данных
и затем полученный ответный пакет раскидать по переменным исходя из этих смещений
мне бы ваши проблемы, а кушать хотса.

Рассмотрим для передачи:
Цитата:
Формат пакета для отправки
Смещение Тип
00 byte
01 byte
02 byte
03 byte
04 byte
05 byte
06 word
08 word
0A word
0C word
0E word
80 word
FE word
Решение "в лоб":
Код:
type
  //PACKET STRUCT-
  SEND_PACKET=record
   p0,
   p1,
   p2,
   p3,
   p4,
   p5: byte;   //1 байт размерность
   p6,         // смещение от нуля 6 байт
   p7,         // смещение от нуля 8 байт
   p8,         // смещение от нуля 10 байт =$0A
   p9,         // смещение от нуля 12 байт =$0C
   p10:  word; // 2 байта размерность // смещение от нуля 14 байт =$0E
   POLE1: array [0..$6F] of Char; // некое неоговоренное поле в структуре данных = $6F = 111 байтам
                                  // начинается с адреса $10, поскольку предыдущий p10 = 2 байта + смещение 14 = 16
                                  // длина поля считается как разность смещения следующего оговоренного параметра-1 и предыдущего
   p12: word;  // $80 = 128, значит POLE1 заканчивается на 127 байте
   POLE2: array [0..$7B] of Char; // некое неоговоренное поле в структуре данных = $7B = 123 байтам
                                  // начинается с адреса $82, поскольку предыдущий p12 = 2 байта + смещение 128 = 130
                                  // длина поля считается как разность смещения следующего оговоренного параметра-1 и предыдущего

   p14: word;  // $FE, значит POLE2 заканчивается на 253 байте
  end; // поскольку размер p14 = 2 байта и начинается он с 254 байта, то общий размер = 256

var data: SEND_PACKET;
Еще можно завести сразу массив нужной длины и задавать внутри потом:
Код:
data2: array [0..$ff] of Char;
Вот вам пакет для передачи. Один нюанс - при использовании юникодных дельфей следует тип char заменить на ansichar, чтобы размер соблюсти.

Цитата:
...для приема
элементарно. Но это уже за отдельную плату.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 07.09.2013, 19:44   #9
qwertyui123
 
Регистрация: 19.08.2013
Сообщений: 8
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
мне бы ваши проблемы, а кушать хотса.

Еще можно завести сразу массив нужной длины и задавать внутри потом:
Код:
data2: array [0..$ff] of Char;
Вот вам пакет для передачи. Один нюанс - при использовании юникодных дельфей следует тип char заменить на ansichar, чтобы размер соблюсти.

элементарно. Но это уже за отдельную плату.
теперь понемногу наступает ясность , спасибо

еще один небольшой вопросик
Я так понимаю в моем случае значит перевести цифру 2 в двоичную систему (строка) и изменять соответствующие биты, затем полученную строку преобразовать в число и отправить в контроллер

Смещение Тип Описание
01 byte Управление
2^0 – Постоянная K1 = 1 или 2 (0/1)
2^1 – Постоянная K2 выкл./вкл. (0/1)
2^2 – Постоянная K3 выкл./вкл. (0/1)
2^3 – 0
2^4 – 0
2^5 – 0
2^6 – 0
2^7 – 0
К примеру получается 2 это 00000010 меняем на 11100000 и конвертируем в число получая 224.

Я не ошибаюсь ?

Последний раз редактировалось Stilet; 08.09.2013 в 14:33.
qwertyui123 вне форума Ответить с цитированием
Старый 08.09.2013, 10:54   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

К сожалению, не могу ответить на ваш вопрос, поскольку вы продолжаете вываливать куски протокола вашего обмена по вашему усмотрению (теперь описание появилось и загадочным образом 00000010 меняется на 11100000). Это называется партизанщина, а я привык видеть проблему в целом, особенно в бесплатных разделах. В любом случае, извините, но помочь более не имею возможности.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обмен данными! Romowski Visual C++ 6 12.12.2012 07:50
Прямой обмен данными между компьютерами через интернет mishanama Работа с сетью в Delphi 0 22.04.2012 14:59
Обмен данными через LPT Vovan91 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 17.02.2011 03:30
Обмен данными saggy Работа с сетью в Delphi 1 14.02.2010 13:10
Обмен данными между формами через переменную типа boolean Человек_Борща Общие вопросы Delphi 3 22.01.2010 20:17