Нестандартные устройства, подключаемые в COM порт

valenciy

Умеет кто-нибудь программить такую хрень? Есть плата с лампочками, которая подрубается в com. Нужно написать прогу, которая эти лампочки включает и выключает. Может кто-нибудь знает где в инете можно почитать про это?

stalker33rus10

Ну во-первых нужно знать какими сигналами с com-порта твои лампочки включаются-выключаются (у ком-а только один провод - выход, кажется 3-й раскладку кома могу дать, хотя в инете ищется без проблем.
Во-вторых, что касается программирования - там используюстя стандартные виндовсие функции - с портом идет работа как с файлом. Я писал в свое время на Делфе, по этому поводу можно почитать http://www.forum.vingrad.ru/index.php?act=ST&f=32&t=1950.
Правда для записи в порт я использовал asm-вставки, что под XP не работало.
Вот исходник оттуда:

function PortInit : boolean; //инициализация
var f: THandle;
ct: TCommTimeouts;
dcb: TDCB;
begin
f := Windows.CreateFile(PChar('COM1' GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (f < 0) or not Windows.SetupComm(f, 2048, 2048)or not
Windows.GetCommState(f, dcb) then exit; //init error dcb.BaudRate := скоpость;
dcb.StopBits := стоп-биты;
dcb.Parity := &divide;етность;
dcb.ByteSize := 8;
if not Windows.SetCommState(f, dcb)
or not Windows.GetCommTimeouts(f, ct) then exit; //error
ct.ReadTotalTimeoutConstant := 50;
ct.ReadIntervalTimeout := 50;
ct.ReadTotalTimeoutMultiplier := 1;
ct.WriteTotalTimeoutMultiplier := 0;
ct.WriteTotalTimeoutConstant := 10;
if not Windows.SetCommTimeouts(f, ct)
or not Windows.SetCommMask(f, EV_RING + EV_RXCHAR + EV_RXFLAG + EV_TXEMPTY)
then exit; //error
result := true;
end; function DoneComm: boolean; //закpыть поpт
begin
result := Windows.CloseHandle(f);
end; function PostComm(var Buf; size: word): integer; //пеpеда&divide;а в поpт
var p: pointer; i: integer;
begin
p := @Buf;
result := 0;
while size > 0 do begin
if not WriteFile(f, p^, 1, i, nil) then exit;
inc(result, i); inc(integer(p; dec(size);
Application.ProcessMessages;
end;
end; function ReadComm(var Buf; size: word): integer; //пpием из поpта
var i: integer; ovr: TOverlapped;
begin
fillChar(buf, size, 0);
fillChar(ovr, sizeOf(ovr 0); i := 0; result := -1;
if not windows.ReadFile(f, buf, size, i, @ovr) then exit;
result := i;
end;


В общем, там читай, вроде в свое время я разобрался без проблем.
Если что - спрашивай, постараюсь помочь.

valenciy

Спасибо! Уже вроде разобрался.

valenciy

Сопротивление девайса сломлено! Теперь он работает так, как нужно!
Оставить комментарий
Имя или ник:
Комментарий: