Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 20 из 20

Тема: Контрольная сумма ТРМ201

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Дмитрий Егоренков Посмотреть сообщение
    не знаю. у меня получается bfc6.
    "ОПИСАНИЕ протокола обмена между ПЭВМ и приборами ОВЕН" не совсем корректное, особенно это касается "СТРУКТУРНОЙ СХЕМЫ ПРОТОКОЛА ОВЕН", вот и претензий много

    я, честно говоря, не первый раз такие спецификации читаю и работаю с ними, поэтому когда писал конфигуратор команд для протокола owen, делал ровно то, что написано в этих документах,

    а получилось это только после того, как увидел 2 "живые" команды на форуме

    вот чтобы такого не происходило, я бы порекомендовал сделать всего 3 дополнения:
    1. перерисуйте эту схему так, чтобы был виден четкий порядок бит, раз уж там они есть
    2. ваш CRC расчитывается с исключением из пакета кроме маркеров еще и самой контрольной суммы, т.е. не текущая, не нулевая, а вообще без этого члена
    3. в документации приведите 1-2 готовые команды, чтобы не ломать мозг

    получается, что заголовок имеет такую структуру:
    Код:
    typedef struct tagOwenHeader{
    	WORD	Low	: 8;
    	WORD	Size	: 4;
    	WORD	Query	: 1;
    	WORD	High	: 3;
    }OWEN_HEADER, *POWEN_HEADER;
    Low - младший байт адреса
    Size - размер поля данных - 2 (2 - это размер хеша имени)
    Query - признак запроса
    High - старшие 3 бита адреса

    перед расчетом CRC хеш команды записывается в пакет перевернутым байтами, т.е. сначала high, потом low,
    после расчета CRC, сам CRC так же переворачивается, после чего, вся полученная последовательность кодируется тетрадами

    на счет уровня приложения-представления - пока не проверял, будем смотреть дальше

    на счет переворачиваний, я пока без самого девайса не понял, но если разбить пакет на 3 сущности: заголовок, команда, CRC, то можно в принципе перевернуть все это дело перед кодированием тетрадами, но тогда не будет сходиться CRC и в данных будет бардак, либо можно тетрады выводить старшим полубайтом вперед, тогда можно не переворачивать, (все зависит от конечной реализации авторов; сам склюняюсь к тому, что все таки напутали порядок полубайтов), вобщем я сделал пока как есть

    в приложении мой конфигуратор команд, это консолька, которая позволяет просто собрать команду, в конечный вид, перед отправкой, так что сам девайс ей не нужен (если кто-то будет вводить имя команды, не забывайте про пробелы в конце этой команды, например "dev " или "ver ")

    (завтра проверю на девайсе, если успею, а сегодня просто выкладываю, т.к. команды уже сходятся по текущей теме и еще по этой: http://www.owen.ru/forum/showthread.php?t=7784)
    Вложения Вложения
    • Тип файла: zip owen.zip (44.6 Кб, Просмотров: 62)
    Последний раз редактировалось mega; 09.06.2010 в 14:18. Причина: подправил приложение: сдвиг старшей части адреса был на 4 бита, теперь как положено - на 8

  2. #2

    По умолчанию

    ваши умозаключения неуместны - вот это факт,

    я читать умею, и как уже сказал, делал как раз по написанному, а
    если вы такой хорошоший специалист, давайте прямо здесь посчитаем пакет по пункту 3.3:

    адрес будет 513
    запрос будет стандартный - dev:

    1. делим адрес на 8 старших и 3 младших бита: 01000000 001b => 0x40 0x01
    2. извлекаем старшую часть адреса: 0x40
    3. извлекаем младшую часть адреса: 0x01
    4. ставим во второй байт бит запроса: 0x09
    5. ставим во второй байт размер 0: 0x09
    6. ставим хеш имени команды: 0xd681
    7. данных нет, контрольную сумму пока пропускаем
    8. формируем пакет: 40 09 d6 81

    а теперь покажите мне безграмотному, как из этого получить #GHLGTMOHTISS\r, т.е. 01 50 d6 81, грамотный вы наш,
    я вам даже предлагаю покрутить этот кубик рубик (попереварачивать байты местами)
    почему не получится, да потому что очевидно

    во первых берется 8 младших битов,

    во вторых - последовательность формирования кадра в описании нарушена, но это еще не все

    битовая схема да - иногда она рисуется октетами, тогда порядок бит будет обратный в каждом байте,
    только ведь это обязательно надо отмечать либо в тексте, либо направлением либо MSB-LSB прямо в схеме, загляните в любой rfc и посмотрите как там описаны протоколы,

    а раз вы не знаете слова "стандарт", то я уже показал вид заголовка на овеновские устройства на си,
    причем сделал это не для вас, а для тех, кому непосчасливится вновь читать этот документ

  3. #3

    По умолчанию

    > а теперь покажите мне безграмотному, как из этого получить #GHLGTMOHTISS\r, т.е. 01 50 d6 81, грамотный вы наш,

    короткий ответ: никак.

    во-первых, заголовок пакета должен выглядеть так:

    Код:
    typedef union tagOwenHeader
    {
    	struct
    	{
    		int	High : 8;
    		int	Size : 4;
    		int	Query : 1;
    		int	Low : 3;
    	};
    
    	unsigned char Bytes[2];
    }OWEN_HEADER, *POWEN_HEADER;
    во-вторых, так как адрес у вас 11-битный, засовывать его в заголовок надо так:

    Код:
    hdr.High = addr >> 3;
    hdr.Low = addr & 0x07;
    и в результате вы получите то, что и должны:

    40 30 D6 81 11 6D и #KGJKTMOHHHMT\В

    ну и для всех остальных.

    порядок и размер членов битового поля стандартом C не определяется. на другой платформе или компиляторе вы можете получить другие результаты. использование union -- плохая практика, особенно когда записывается один элемент, а читается другой.

    и вообще, все это стрельба из пушки по воробьям, потому что проще и понятней писать сразу в буфер (Command в нашем случае).

  4. #4

    По умолчанию Расчет контрольной суммы на Delphi

    //Расчет контрольной суммы по алгоритму овен
    Function TForm1.owenCRC16(str:string):string;
    const
    //AsChars: array[0..15] of Char = 'GHIJKLMNOPQRSTUV';
    HexChars: array[0..15] of Char = '0123456789ABCDEF';
    var
    b:byte;i,j:integer; crc:word;
    begin
    crc:= 0;
    for i:= 0 to (length(str)div 2)-1 do
    begin
    b:=strtoint('$'+copy(str,(2*i)+1,2));
    for j:=1 to 8 do
    begin
    if ((b xor(crc shr 8))and $80)>0 then
    begin
    crc:=crc shl 1;
    crc:=crc xor $8F57;
    end
    else
    crc:=crc shl 1;
    b:=b shl 1;
    end;
    end;
    result:=char(HexChars[crc div 4096])+
    char(HexChars[(crc mod 4096)div 256])+
    char(HexChars[((crc mod 4096)mod 256)div 16])+
    char(HexChars[((crc mod 4096)mod 256)mod 16]);
    end;
    Последний раз редактировалось denver; 17.01.2012 в 18:24.

Страница 2 из 2 ПерваяПервая 12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •