Тема: Com-порт
Показать сообщение отдельно
  #14  
Старый 04.10.2011, 17:33
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
Лампочка Немного общей информации по порту RS232

На 9-ти контактном разъеме COM-порта всего есть 8 сигнальных линий: 5 на вход и 3 на выход. Из этих 8 линий, две отвечают за прием/передачу данных (одна линия на передачу и одна на прием). Эти две линии - это, собственно и есть основа COM-порта. Остальные 6 линий - вспомогательные, они используются не для передачи данных, а для управления процессом передачи. За передачу/прием данных отвечают функции ReadFile/WriteFile. За чтение/установку состояний вспомогательных линий в ручном режиме отвечают функции GetCommModemStatus/EscapeCommFunction (еще эти линии могут управляться аппаратно - при соответствующих настройках COM-порта).

Очевидно что для управления устройством можно использовать только выходные линии. Их всего три - это TX, DTR, RTS. Линию TX нельзя установить в фиксированное состояние - она может лишь выдавать данные, бит за битом, с установленной скоростью. За выдачу данных по линии TX отвечает функция WriteFile. Линии DTR, RTS можно переключить в фиксированное состояние: лог. 0 или 1 (Если, разумеется, не активирован какой-нибудь автоматический режим. Если активирован - состояние линий будет устанавливаться аппаратно). Максимальная скорость, переключения линий DTR,RTS может достигать нескольких десятков килогерц, поэтому на них вполне можно реализовать какой-нибудь протокол.

Вот перечень команд для установки состояния линий DTR/RTS:
Код:
EscapeCommFunction(Handle,CLRDTR); // лог.0 на линии DTR (-12В на ноге 4)
EscapeCommFunction(Handle,SETDTR); // лог.1 на линии DTR (+12В на ноге 4)
EscapeCommFunction(Handle,CLRRTS); // лог.0 на линии RTS (-12В на ноге 7)
EscapeCommFunction(Handle,SETRTS); // лог.1 на линии RTS (+12В на ноге 7)

Вот функции для передачи данных по линии TX:
Код:
var Buffer:AnsiString; BytesWritten:cardinal;
  ...
  Buffer := 'AT COMMAND'; // Строка
  Buffer := #$00#$01#$02#$03; // А так можно и бинарные данные передать.
  WriteFile(Handle,Buffer[1],length(Buffer),BytesWritten,nil);
  WriteFileEx(...); // Пример вызова этой функции намного сложнее.

P.S. Если в вашей схеме только светодиод и резистор, светодиод вполне может быть пробит при обратной полярности. Лучше вместо одного светодиода включить встречно-параллельно два светодиода разного цвета - и надежно и смотрится хорошо.
Ответить с цитированием