@VexeR
VexeR
14 Mar 2011

Повторюсь, но во вменяемое время... Пытаюсь работать с COM-портом. Отправляю строку, возвращается то же самое, как эхо. Вопрос — какого черта? В смысле, дайте пример работающий, что ли... Сам уже задолбался, найденное в гугле все некошерное почему-то. Должна же быть от Жуйка польза)

14 Mar 2011

Спросил бы меня года 2-3 назад... А сейчас даже исходники утеряны.

14 Mar 2011

попробуй зайди в конфу делфи

14 Mar 2011

Ну туда-то я точно пойду, только в последнюю очередь уже.

#ntwhr/3 в ответ на /2
14 Mar 2011

А ты куда посылаешь строку? Девайс вполне может выдавать эхо и это нормально.

14 Mar 2011

Советую посмотреть TComPortLib - лучшее, что я видел для работы с COM-портом.
Если будет надо, могу потом найти исходники своей программы для прямого обмена с подключенным устройством.

14 Mar 2011

Строку, да. Но реакцией должно быть как минимум еще и имя производителя помимо "эха" (если оно вообще "эхить" должно). GSM-модуль мучаю...

#ntwhr/6 в ответ на /4
14 Mar 2011

Да писать и читать - легко, все по примерам делается. Но устройство почему-то не работает. Через гипертерминал - все ок, можно работать. А автоматизировать почему-то не выходит.

#ntwhr/7 в ответ на /5
14 Mar 2011

USB-GSM модуль с виртуальным портом, или внешний на реальном COM порту?
AT команды? Перевод строки как кидаешь -- \r\n или \n ?

#ntwhr/8 в ответ на /6
14 Mar 2011

Реальный COM. Перевод строки - и так, и так пробовал. Либо в таймингах дело, либо в какой-то другой подобной детали, думаю. Чем мистичнее глюк, тем мельче причина, его порождающая.

#ntwhr/9 в ответ на /8
14 Mar 2011

Флаговые ноги выставил? Контроль потока? Скорость порта какая?

#ntwhr/10 в ответ на /9
14 Mar 2011

Поступаю классически:
GetCommState(port, DCB);
DCB.BaudRate:=9600;
DCB.Parity:=NoParity;
DCB.ByteSize:=8;
DCB.StopBits:=ONESTOPBIT;
DCB.EvtChar:=#0;
SetCommState(port, DCB);

GetCommTimeouts(Port, CommTimeouts);
CommTimeouts.ReadIntervalTimeout :=MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier := 0;
CommTimeouts.ReadTotalTimeoutConstant := 0;
CommTimeouts.WriteTotalTimeoutMultiplier := 0;
CommTimeouts.WriteTotalTimeoutConstant := 0;
SetCommTimeouts(Port, CommTimeouts);

#ntwhr/11 в ответ на /10
14 Mar 2011

Не понял... таймауты в ноль зачем? Щас найду свой код, сек

#ntwhr/12 в ответ на /11
14 Mar 2011

Так, если обкусать нерелевантные части, то вот так:
const
PortName: string = 'COM1:'#0;
ParamStr: string = 'BAUD=9600 PARITY=N DATA=8 STOP=2'#0;
TimeOuts: TCOMMTIMEOUTS = (
ReadIntervalTimeout: -1;
ReadTotalTimeoutMultiplier: -1;
ReadTotalTimeoutConstant: 50;
WriteTotalTimeoutMultiplier:50;
WriteTotalTimeoutConstant: 10
);
var port: THandle;
procedure InitPort;
var DCB: TDCB; i: longint;
begin
Port := CreateFile(@PortName[1], GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, 3, 0, 0);
FillChar(DCB, SizeOf(DCB), 0);
BuildCommDCB(@ParamStr[1], DCB);
// Выставляю ноги для питалова девайса
DCB.Flags:=1 shl 0 + 1 shl 2 + 1 shl 3 + 1 shl 7
+1 shl 6 + rts_Control_Enable shl 12;
// У тебя это возможно и не надо, но как-то rts/dtr настроить надо
SetCommState(Port, DCB);
SetCommTimeouts(Port, TimeOuts);
SetupComm(Port, 2048, 2048);
end;

// Поток-читатель:
ReadFile(Port, C, 1, Num, nil);
// где C: char, у меня протокол посимвольный, потому я по буквенно читаю
If Num!=0 then ...
....

// Поток-писатель:
ClearCommError(Port, n, nil);
WriteFile(Port, str[1], 3, n, nil);

14 Mar 2011

таймаутами я игрался, не помогает... Твой код попробую - отчитаюсь, спасибо.

#ntwhr/14 в ответ на /13

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.