Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Передача данных в COM порт


Автор: EEEEEE 8.5.2008, 00:37
Есть описание пакета передачи.

Определение пакета.
Устройство выдает и принимает по последовательному каналу 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?

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

Автор: EnergoHokum 8.5.2008, 07:44
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;/* Потом их можно будет сложить в массив так, как душе угодно */
}

Как-то так...

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

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

smile

Автор: EnergoHokum 8.5.2008, 08:25
Я тогда ещё не проснулся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)