Страница 1 из 2
Как послать команду в COM-порт
Добавлено: 08 дек 2005, 15:37
mch
Здраствуйте!
Сразу скажу, что я не программист, а железячник. Делфи знаю постольку, поскольку...
У меня возник такой вопрос:
Нужно передать в COM-порт команду в HEX. Как это можно сделать в Делфи. И еще: как можно отправить текстовый фаил в ком порт из делфи (по аналогии с досом copy con filename.txt comN)?
Добавлено: 08 дек 2005, 16:42
Naeel Maqsudov
Ну, если по аналогии с 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 тоже должно работать.
Добавлено: 08 дек 2005, 16:51
Naeel Maqsudov
Да. Должно быть можно!
COPY COM1 CON
прокатывает! Становится в ожидание. Будет печатать на экран все что придет в ком-порт (1 байт = 1 символ) до тех пор пока не втретится символ ^Z (конец файла).
Добавлено: 09 дек 2005, 06:15
mch
System.Write(f,#8#43#11#44#99#127+"<-там десятичные коды символов, здесь текст, а там НЕХ->"+chr($23)+chr($FA));
Можно подробней про формат
Добавлено: 09 дек 2005, 10:06
Naeel Maqsudov
Да. Этот синтаксис существует начиная с версии ТурбоПаскаль 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'
Добавлено: 09 дек 2005, 10:53
mch
Спасибо, буду пробовать. А как отправить текстовый файл в ком?
Добавлено: 09 дек 2005, 11:55
Naeel Maqsudov
А читать файл по байтам, да и передавать.
Вот только непонятно, где конец файла. Для команды Copy это управляющий символ ^Z.
Выхода, собственно 2:
1) что-то типа битстаффинга (точнее, в нашем случае байтстаффинга) Собираем статистику, вычисляем, какое значение в файлах встречается реже всего. Объявляем его стоп-байтом. Чтобы исключить имитацию стоп-байта в данных, если нужно передать значение равное стоп-байту, то передаем его дважды. При приеме
если получено два значения равные стоп-байту подряд, то сохраняем только одно. А если получено одно и долго ничего нет, то завершаем прием.
2) Передача пакетами с указанием длины.
Берем кусочек файла в N байт. Перенаем сначала N, потом данные. А когда передавать больше нечего, то передаем 0. При приеме, получив N складываем следующие N байт в буфер (или пишем в файл). Если пришедшее N=0 то завершаем прием.
Первый способ надежнее, на мой взгляд.
Чтение: Read(f,Ch);
Запись: Write(f,Ch);
Ch - переменная типа Char
Числовое значение передаваемого/получаемого байта = byte(Ch)
Добавлено: 11 дек 2005, 00:03
YurikGL
Я бы еще добавил, что существуют компоненты для работы с com портом. Например, comm32.
Добавлено: 14 дек 2005, 08:49
mch
Вот! Это самое то, что мне надо. А где можно взять? И документацию бы еще
Добавлено: 14 дек 2005, 12:58
Naeel Maqsudov
Ищите "компоненты comm32" в
http://www.google.ru
Заодно найдете обсуждения использования.