Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача данных в COM порт, передача шестнадцатиричных данных 
:(
    Опции темы
EEEEEE
Дата 8.5.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть описание пакета передачи.

Определение пакета.
Устройство выдает и принимает по последовательному каналу RS-232 информацию в виде последовательности следующих пакетов:
<Флаг><Идентификатор>... слова данных ...<КС><Флаг><ПрК>
где:
<Флаг> - Символ начала/конца пакета данных, длина 1 байт, значение - символ ASCII <DLE> (10h -> 0001000).
<Идентификатор> - идентификационное число типа пакета (номер пакета) длиной 1 байт, выраженное в виде 2-х шестнадцатеричных цифр. Этот байт может иметь любое значение, отличное от 10h <DLE> или 03h <ETX> (00000011). Конкретное значение идентификационных чисел приводится далее.
Слова данных - конкретная передаваемая информация. Передается сначала младший байт слова данных, затем старший. Если в информации встречается байт 10h, то он должен быть повторен два раза для того, чтобы можно было его отличить от символа начала/конца пакета <Флаг>. Соответственно, на приемном конце все встречающиеся двойные байты 10h должны быть сжаты в одиночные символы 10h.
<КС> - контрольная сумма длиной 2 байта. Сумма по модулю 2 всех слов (длиной 16 бит) конкретной передаваемой информации. Передается сначала младший байт контрольной суммы, затем старший. Если значение байта равно 10h, то он повторяется 2 раза (как и в словах данных).
<ПрК> - символ конца текста, длина 1 байт, значение - символ ASCII <ETX> (03h).


Подскажите, пожалуйста, дилетанту:
1. Как сформировать и переслать пакет 41h, который является <Идентификатор>, при том, что передача в порт осуществляется массива типа char?
2. Как рассчитать <КС> - контрольную сумму и переслать сначала младший байт контрольной суммы, затем старший?
Повторяюсь.
3. Как переслать данные с учетом того, что передается сначала младший байт слова данных, затем старший? Данные могут быть по типу от char до Double?
PM MAIL   Вверх
vladimir_ad
Дата 8.5.2008, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я поступил бы так:
1 создаем место для строки и используя sprintf и тд заполняем ее данными. Далее остается отправить строку в коммуникационный порт;
2 указатель на передаваемые данные интерпретируем как указатель на слово и суммируем содержимое буфера данных;
3 указатель на передаваемые данные интерпретируем как указатель на char и последовательно печатаем в нашу строку.

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

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



1. А что тебя тут смущает-то? Диапазон значений char (на платформе x86) лежит от 00h до FFh, и 41h сюда влезает только так...
2. Насчёт расчёта КС -- не знаю, нужно её алгоритм в документации смотреть. Может, она -- простое суммирование по модулю 2, может -- CRC32. Непонятно. Что касается разбить КС на два char -- вот код:
Код

#include <cstdio>
//-------------------------------------------------------------------------
/*
    g++ -Wall -o ./main7 ./main7.cpp
*/
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
    int i=0x30A;/* Это число будем разбивать */
    printf("i=%u\n",i & 0xFF);/* Выделяем младший char */
    printf("(i & 0xFF00)=%u\n",(i & 0xFF00) >> 8);/* А это -- старший char */
    return 0;/* Потом их можно будет сложить в массив так, как душе угодно */
}

Как-то так...
PM MAIL ICQ   Вверх
vladimir_ad
Дата 8.5.2008, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(EEEEEE @  8.5.2008,  00:37 Найти цитируемый пост)
<КС> - контрольная сумма длиной 2 байта. Сумма по модулю 2 всех слов (длиной 16 бит) конкретной передаваемой информации. 

smile
Цитата(EnergoHokum @  8.5.2008,  07:44 Найти цитируемый пост)
Насчёт расчёта КС -- не знаю, нужно её алгоритм в документации смотреть. Может, она -- простое суммирование по модулю 2, может -- CRC32.

smile
PM MAIL   Вверх
EnergoHokum
Дата 8.5.2008, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

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



Я тогда ещё не проснулся.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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