Форум: "Прочее";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизКак получить ответ от Com-порта? Найти похожие ветки
← →
Аноним2000 (2006-05-25 22:51) [0]Всем привет! Задача очень простая. На com-порте висит модем. Открываю com при помощи CreateFile. WriteFile-ом посылаю туда строку "AT\r". Как мне получить строку "OK" как в терминале?
И вообще, если не трудно, киньте ссылкой с материалами по теме? ;)
← →
Marser © (2006-05-25 22:54) [1]В йнексе навалом.
← →
Marser © (2006-05-25 22:54) [2]> йнексе
Яндексе.
← →
isasa © (2006-05-25 23:16) [3]Да, в Яндексе.:)
Только, сразу можно сказать, что модем работает в двух режимах: данных и команд. По умолчанию - в режиме данных. Для Ok! - надо перевести в режим команд. Там не все так просто(в смысле перевода - посыл +++, с определенной задержкой).
Ищи "модем" "команднвй режим".
← →
wal © (2006-05-26 09:22) [4]
> [3] isasa © (25.05.06 23:16)
Неправда ваша, по умолчанию как раз в режиме команд. В режим данных переходит только после ATD, и при удачном коннекте. Но и в режиме команд есть нюанс, а именно два подрежима: отвечать текстом или кодом (то есть вместо "ОК" вполне можно получить "0"-ноль). Но, опять таки, по умолчанию, текстовый режим. Только тут еще один нюанс, настройки по умолчанию тоже могут быть изменены.
С уважением.
← →
tesseract © (2006-05-26 10:50) [5]
> WriteFile-ом посылаю туда строку "AT\r". Как мне получить
> строку "OK" как в терминале?
Классный вопрос !!!
REadFile-ом конечно
← →
Аноним2000 (2006-05-29 00:38) [6]
> Классный вопрос !!!
> REadFile-ом конечно
ну, попробуй :)
я добился своего.
надо просто подождать WaitCommEvent-ом события EV_RXCHAR.
тогда ReadFile прочитает что-то типа "AT\r\r\nOK\r\n"
единственная проблема - я понятия не имею сколько байтов нужно запросить в ReadFile. Дело в том, что если последний параметр ReadFile указать NULL (не OVERLAPPED I/O). то она не вернет управление пока не прочитает столько байто сколько я укажу (т.е. я не могу попросить ее прочитать с запасом).
Как быть? читать по одному символу? или юзать OVERLAPPED-режим?
но как? если напишу что-то типа:
HANDLE hCom = CreateFile( pcCommPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
OVERLAPPED ov;
memset ( &ov, 0, sizeof (ov) );
ov.hEvent = CreateEvent(0/*security*/, TRUE /*auto reset event*/, FALSE /*not signaled*/, 0);
assert(ov.hEvent);
...
BOOL write_ok = ::WriteFile ( hCom, str, strlen(str), &written, &ov);
WriteFile не сработает
← →
Аноним2000 (2006-05-29 00:47) [7]2wal
я об этом слышал (о том, что вместо текстового ответа может код возвращаться). а не знаешь ли как при помощи API функций управлять этим делом?
интересно, кстати как при коннекте все эти мессаги тогда полезут что CONNECTED at 33600.. )
а модем кстати, верно, по умолчанию находится в коммандном режиме (мой по крайней мере:) )
← →
Defunct © (2006-05-29 04:55) [8]> единственная проблема - я понятия не имею сколько байтов нужно запросить в ReadFile.
по одному - не ошибетесь
← →
tesseract © (2006-05-29 10:04) [9]
> Как быть? читать по одному символу? или юзать OVERLAPPED-
> режим?
Его надо юзать.
Пример определить сколько байт в буфере:
function TcomPort.pApiGetInCount: dword;
var hCurState:TCOMSTAT;
ErrCode:cardinal;
begin
ClearCommError(hCom, ErrCode, @hCurState);
result:=hCurState.cbInQue;
end;
← →
Аноним2000 (2006-05-29 22:46) [10]2Defunct
можно по одному, но это как-то не круто)
хотя http://www.codeproject.com/system/SerialPortComm.asp поступают именно так
2tesseract
точно! я никак не мог допереть! сенкс!
теперь все работает.
всем спасибо. еще поизучаю статьи на досуге
← →
DiamondShark © (2006-05-30 00:02) [11]
> т.е. я не могу попросить ее прочитать с запасом
могу.
если тайм-ауты для порта настроить.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c