На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Работа с модемом , статья
      M
      Эта тема была разделена из темы Компонент для работы с модемом
      Статейка (Евгений Дружинин.)

      Итак, исходные данные: модем подключен к порту COM3.
      Сначала, как и описано во всех источниках, открываем COM порт, к которому подключен модем:
      ExpandedWrap disabled
        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, то к порту на самом деле подключен модем.

      Теперь наступает первый ключевой момент, почти нигде не описанный. Надо установить размеры входного и выходного буферов, в которых будут размещаться данные, передаваемые в модем и принимаемые от него:
      ExpandedWrap disabled
        SetupComm(hCommFile,SizeOf(inBuffer),SizeOf(OutBuffer))



      Установив размеры буферов, считываем структуру DCB COM порта.

      ExpandedWrap disabled
        GetCommState(hCommFile,DCB)


      В считанной структуре необходимо установить количество битов данных - 8. И, при желании, скорость COM порта (я задаю максимальное значение - 115200). Записываем новые значения:

      ExpandedWrap disabled
        SetCommState(hCommFile,DCB)


      Считываем информацию о таймаутах:

      ExpandedWrap disabled
        GetCommTimeouts(hCommFile,CommTOuts)


      устанавливаем свои значения:

      ExpandedWrap disabled
        CommTOuts.ReadIntervalTimeout:=1800;
        CommTOuts.ReadTotalTimeoutMultiplier:=30;
        CommTOuts.ReadTotalTimeoutConstant:=6000;
        CommTOuts.WriteTotalTimeoutMultiplier:=30;
        CommTOuts.WriteTotalTimeoutConstant:=6000;


      и записываем их:
      ExpandedWrap disabled
        SetCommTimeouts(hCommFile,CommTOuts)


      Всё! COM порт полностью подготовлен к работе. А как же передавать команды модему и получать от него ответы? Оказывается достаточно просто!

      Записываем команду в выходной буфер, не забыв завершить строку #13#10, и вызываем функцию:
      ExpandedWrap disabled
        WriteFile(hCommFile,
                       OutBuffer,
                       Length(PhoneCommand),
                       NumberWritten,
                       nil)


      Ну, пока всё так, как и пишется во всех форумах и статьях. Однако если теперь выполнить функцию ReadFile, то во входном буфере будет та же самая строка, что и в выходном буфере. Так что же делать? А вот здесь вторая и главная особенность описываемого мной метода общения с модемом. Этого я не нашел ни в каких источниках. После выполнения функции WriteFile нужно очистить буферы:

      ExpandedWrap disabled
        PurgeComm(hCommFile,PURGE_TXCLEAR + PURGE_RXCLEAR)
         
        // и дальше читать:
         
        ReadFile(hCommFile,InBuffer,SizeOf(InBuffer),BytesRead,nil)


      Вот и всё. Описанным выше методом можно передавать модему АТ команды и смотреть, как он на них отвечает. Исходные коды примера и исполняемый файл находятся в прилагаемом архиве.
      PS: Архив - zip
      Прикреплённый файлПрикреплённый файлmodem.zip (205.74 Кбайт, скачиваний: 184)
        Используйте функцию Windows API CreateFile() чтобы получить дескриптор порта, и стандартные функции ввода-вывода для связи с полученным портом.
        Пример:

        ExpandedWrap disabled
          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
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0260 ]   [ 16 queries used ]   [ Generated: 3.05.24, 05:34 GMT ]