Как послать команду в COM-порт

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

mch
Сообщения: 5
Зарегистрирован: 08 дек 2005, 15:06

Здраствуйте!
Сразу скажу, что я не программист, а железячник. Делфи знаю постольку, поскольку...
У меня возник такой вопрос:
Нужно передать в COM-порт команду в HEX. Как это можно сделать в Делфи. И еще: как можно отправить текстовый фаил в ком порт из делфи (по аналогии с досом copy con filename.txt comN)?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Ну, если по аналогии с DOS, то и в DOS и в Windows имена файлов
PRN, LPTn, COMn и CON являются предопределенным и асоциированными с определенными устройствами.

Следовательно самый экологичный способ, это отдать работу с устройствами на откуп операционной системе. Т.е. открыть файл с таким именем и писать туда данные.

Соответственно, в дельфи мы это будем делать также как делали это в турбопаскале.

Код: Выделить всё

var f:text;
...
  System.Assign(f,"COM1");
  System.Rewrite(f);
  System.Write(f,#8#43#11#44#99#127+"<-там десятичные коды символов, здесь текст, а там НЕХ->"+chr($23)+chr($FA));
  Close(f);
Так как Assing перекрыта модулями, которые обычно подгружаются позже System, то в Delphi скорее всего явно придется указать из какого модуля должна быть взята процедура Assign.

Ошибки отлавливутривать внутри опций компилятора {$I-}...{$I+} c помощью переменной System.Lastresult.

По файлы CON могут быть открыты на чтение (Reset вместо Rewrite). По идее с COMn тоже должно работать.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Да. Должно быть можно!

COPY COM1 CON

прокатывает! Становится в ожидание. Будет печатать на экран все что придет в ком-порт (1 байт = 1 символ) до тех пор пока не втретится символ ^Z (конец файла).
mch
Сообщения: 5
Зарегистрирован: 08 дек 2005, 15:06

System.Write(f,#8#43#11#44#99#127+"<-там десятичные коды символов, здесь текст, а там НЕХ->"+chr($23)+chr($FA));
Можно подробней про формат
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Да. Этот синтаксис существует начиная с версии ТурбоПаскаль 5.0

String: 'это символы, заключенные в кавычки'
Char: 'x' - это 1 символ
Также, в случаях, когда в коде програмы целесообразнее (для читабельности)
употреблять коды символов вместо самих символов используется:
1) Char(X), (это не функция а typecast (приведение типов)). X может быть переменной (выражением) типа Byte или константой типа Byte. Шестнадцатеричные числа предваряются знаком $.
Например: Char(X); Char(48); Char($2A) являются выражениями типа Char. Их можно сложить - получится String - Char(X)+Char(48)+Char($2A).
2) Нотация #X. Здесь нельзя употреблять 16-чных чисел, но она может создавать и выражения типа Char и выражения типа String (без использования знака +).
#48=Char(48)=Char($30)='0'
#48#49=Char(48)+Char(49)=Char($30)+Char($31)='01'
mch
Сообщения: 5
Зарегистрирован: 08 дек 2005, 15:06

Спасибо, буду пробовать. А как отправить текстовый файл в ком?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А читать файл по байтам, да и передавать.
Вот только непонятно, где конец файла. Для команды Copy это управляющий символ ^Z.
Выхода, собственно 2:
1) что-то типа битстаффинга (точнее, в нашем случае байтстаффинга) Собираем статистику, вычисляем, какое значение в файлах встречается реже всего. Объявляем его стоп-байтом. Чтобы исключить имитацию стоп-байта в данных, если нужно передать значение равное стоп-байту, то передаем его дважды. При приеме
если получено два значения равные стоп-байту подряд, то сохраняем только одно. А если получено одно и долго ничего нет, то завершаем прием.

2) Передача пакетами с указанием длины.
Берем кусочек файла в N байт. Перенаем сначала N, потом данные. А когда передавать больше нечего, то передаем 0. При приеме, получив N складываем следующие N байт в буфер (или пишем в файл). Если пришедшее N=0 то завершаем прием.

Первый способ надежнее, на мой взгляд.

Чтение: Read(f,Ch);
Запись: Write(f,Ch);
Ch - переменная типа Char
Числовое значение передаваемого/получаемого байта = byte(Ch)
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

Я бы еще добавил, что существуют компоненты для работы с com портом. Например, comm32.
mch
Сообщения: 5
Зарегистрирован: 08 дек 2005, 15:06

Вот! Это самое то, что мне надо. А где можно взять? И документацию бы еще
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Ищите "компоненты comm32" в http://www.google.ru
Заодно найдете обсуждения использования.
Ответить