Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.129.100] |
|
Сообщ.
#1
,
|
|
|
M Эта тема была разделена из темы Компонент для работы с модемом Итак, исходные данные: модем подключен к порту COM3. Сначала, как и описано во всех источниках, открываем COM порт, к которому подключен модем: hCommFile := CreateFile(PChar('\\.\COM3'), GENERIC_WRITE+GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Далее, если hCommFile<> INVALID_HANDLE_VALUE, то считываем свойства COM порта функцией GetCommProperties(hCommFile,CommProp) и убеждаемся, что устройство, подключенное к порту COM3, действительно является модемом. Если CommProp.dwProvSubType = PST_MODEM, то к порту на самом деле подключен модем. Теперь наступает первый ключевой момент, почти нигде не описанный. Надо установить размеры входного и выходного буферов, в которых будут размещаться данные, передаваемые в модем и принимаемые от него: SetupComm(hCommFile,SizeOf(inBuffer),SizeOf(OutBuffer)) Установив размеры буферов, считываем структуру DCB COM порта. GetCommState(hCommFile,DCB) В считанной структуре необходимо установить количество битов данных - 8. И, при желании, скорость COM порта (я задаю максимальное значение - 115200). Записываем новые значения: SetCommState(hCommFile,DCB) Считываем информацию о таймаутах: GetCommTimeouts(hCommFile,CommTOuts) устанавливаем свои значения: CommTOuts.ReadIntervalTimeout:=1800; CommTOuts.ReadTotalTimeoutMultiplier:=30; CommTOuts.ReadTotalTimeoutConstant:=6000; CommTOuts.WriteTotalTimeoutMultiplier:=30; CommTOuts.WriteTotalTimeoutConstant:=6000; и записываем их: SetCommTimeouts(hCommFile,CommTOuts) Всё! COM порт полностью подготовлен к работе. А как же передавать команды модему и получать от него ответы? Оказывается достаточно просто! Записываем команду в выходной буфер, не забыв завершить строку #13#10, и вызываем функцию: WriteFile(hCommFile, OutBuffer, Length(PhoneCommand), NumberWritten, nil) Ну, пока всё так, как и пишется во всех форумах и статьях. Однако если теперь выполнить функцию ReadFile, то во входном буфере будет та же самая строка, что и в выходном буфере. Так что же делать? А вот здесь вторая и главная особенность описываемого мной метода общения с модемом. Этого я не нашел ни в каких источниках. После выполнения функции WriteFile нужно очистить буферы: PurgeComm(hCommFile,PURGE_TXCLEAR + PURGE_RXCLEAR) // и дальше читать: ReadFile(hCommFile,InBuffer,SizeOf(InBuffer),BytesRead,nil) Вот и всё. Описанным выше методом можно передавать модему АТ команды и смотреть, как он на них отвечает. Исходные коды примера и исполняемый файл находятся в прилагаемом архиве. PS: Архив - zip Прикреплённый файлmodem.zip (205.74 Кбайт, скачиваний: 184) |
Сообщ.
#2
,
|
|
|
Используйте функцию Windows API CreateFile() чтобы получить дескриптор порта, и стандартные функции ввода-вывода для связи с полученным портом.
Пример: Var hCommFile : THandle; procedure TForm1.Button1Click(Sender: TObject); Var PhoneNumber: String; CommPort: String; NumberWritten: Cardinal; Begin PhoneNumber:='ATDT 1-555-555-1212'#13#10; CommPort:='COM2'; {Open the comm port} hCommFile:=CreateFile(PChar(CommPort),GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); IF hCommFile=INVALID_HANDLE_VALUE then Begin ShowMessage('Unable to open '+CommPort); Exit; End; {Dial the phone} NumberWritten:=0; IF not WriteFile(hCommFile,PChar(PhoneNumber)^,Length(PhoneNumber),NumberWritten,nil) then ShowMessage('Unable to write to ' + CommPort); end; Procedure TForm1.Button2Click(Sender: TObject); Begin CloseHandle(hCommFile); End; Источник: Дельфи. Вокруг да около. Взято с http://www.delphimaster.ru/cgi-bin/faq.pl?...=988621981&n=20 Тема - элемент ЧАВО. Подготовлена by © Song |