Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 -- вот код:
Как-то так... |
Автор: EnergoHokum 8.5.2008, 08:25 |
Я тогда ещё не проснулся. |