на главную написать письмо автору карта сайта поиск па сайту
Статьи | Файлы / Скачать | Ссылки | Windows faq

  Дополнительное меню


  На главную :: Статьи :: Samsung :: Инструкции по Железу :: Ставим ICQ-клиент на телефон

Внимание я автор сайта "Егоров Дмитрий" и авторы данных статей не несут никакой ответственности за ваши действия с материалами данных статей. Все статьи, а это примерно 70% были мной проверенны и работали, перед использованием Внимательно прочитайте СТАТЬЮ во избежании поломок апорта и некорректной работы.

Просьба: не беспокоить автора сайта вопросами типа "как зделать картинку, как заделать мелодию и т.д." ответы на эти вопросы вы найдёте в разделе "статьи"


  • Получение списка имеющихся в системе портов
    Существует как минимум два способа:
    1. Список доступных портов можно узнать, проанализировав ключ реестра HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM
    2. Можно поочередно попробовать открыть порты COM1 .. COM9, таким образом удасться установить все доступные порты (т.е. порты, не открытые другими приложениями)

    Открытие и настройка COM порта
    Работу с СOM портом проще всего пояснить на примере

    var
     DCB   : TDCB;
     hPort : THandle;
    begin
      // 1. Открываем файл
      hPort := CreateFile(PChar(\'COM\'+IntToStr(<номер порта>)),
                          GENERIC_READ + GENERIC_WRITE,
                          0, nil, 
                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      // 2. Контроль ошибок
      if hPort = INVALID_HANDLE_VALUE then begin
       // Обнаружена ошибка, порт открыть не удалось
       exit;
      end;
      // 3. Чтение текущих настроек порта
      if GetCommState(hPort, DCB) then ;
      // 4. Настройки:
      // Скорость обмена
      DCB.BaudRate := [скорость обмена];
      // Число бит на символ
      DCB.ByteSize := [размер \"байта\" при обмене по COM порту - обычно 8 бит];
      // Стоп-биты
      DCB.StopBits := [константа, определяющая кол-во стопбитов];
      // Четность
      DCB.Parity   := [константа, определяющая режим контроля четности];
      DCB.Flags := 20625;
      // 5. Передача настроек
      if not SetCommState(hPort, DCB) then {ошибка настройки порта};
      // 6. Настройка буферов порта (очередей ввода и вывода)
      if not SetupComm(hPort, 16, 16) then {ошибка настройки буферов};
      // 7. Сброс буфферов и очередей
      if PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then ;
      ...............
      // 8. Закрытие порта
      CloseHandle(hPort);
    end;
    
    Теперь рассмотрим все шаги по порядку:
    • Шаг 1 - открытие порта. Порт открывается стандартной командой CreateFile, только в качестве имени файла передается имя порта (например, \"COM1\")
    • Шаг 2 - проверка успешности шага 1. Если порт открылся, то функция CreateFile возвращает его Handle, иначе hPort = INVALID_HANDLE_VALUE, что свидетельствует об ошибке
    • Шаг 3 - загрузка текущих настроек порта при помощи функции GetCommState. Этот шаг не является обязательным, т.к. можно настроить порт, как говорится, \"с нуля\". После выполнения GetCommState структура DCB заполняется текущими настройками
    • Шаг 4 - занесение в структуру DCB необходимых настроек
    • Шаг 5 - Настрока порта при помощи функции SetCommState. После настройки с портом уже можно работать, но в примере я выполняю полную настроку (шаги 6 и 7)
    • Шаг 6 - Настрока размеров буфера приема и предачи при помощи SetupComm. В моем примере заданы буфера очень небольшого размера, рекомендуется задать окого 1 кб
    • Шаг 7 - Очистка буферов и очередей порта - второй параметра функции PurgeComm является битовой маской и задает, что именно необходимо очитстить - в нашем случае все по максимуму
    • Шаг 8 - закрытие порта после завершения работы с ним

    Чтение и запись данных
    Запись данных производится следующим образом:

     Result := WriteFile(hPort, Buffer, Size, NumberOfBytesWritten, nil);
    
    параметр NumberOfBytesWritten после выполнения содержит количество реально переданных байт.
    Чтение данных:
     
     Result := ReadFile(hPort, Buffer, Size, NumberOfBytesReaded, nil);
    
    параметр Size задает читаемый объем информации (его значение должно быть меньше объема буфера), NumberOfBytesReaded получает количество реально прочитанных байт

    Настройка таймаутов приема и передачи
    Настройку таймаутов можно провести при помощи слудующей функции:

    function SetComPortTimeouts: boolean;
    var
     CommTimeouts : TCommTimeouts;
     ComErrors    : DWORD;
    begin
     Result := false;
     // Если соединение есть, то перенастроим его
     if hPort <> INVALID_HANDLE_VALUE then begin
      // Чтение текущих таймаутов
      GetCommTimeouts(hPort, CommTimeouts);
      ... настройка параметров структуры CommTimeouts ...
      // Установка таймаутов
      SetCommTimeouts(hPort, CommTimeouts);
      Result := true;
     end;
    end;
    

    Запрос ошибки
    Запрос ошибки производится при помощи функции ClearCommError

    var
     ComErrors    : DWORD;
    begin
     ClearCommError(hPort, ComErrors, nil);
    end;
    
    Данная функция сбрасывает состояние ошибки, передавая код ошибки в переменную ComErrors


    Просьба если вы знаете ещё что ни будь такое чего у нас нет то не держите в тайне присылайте мы оп поблекуем (и незабываем об авторских правах, имя автора и его e-mail будет указан 100%)

    >> Прислать материал <<


2005-2006 © mobil-faq.narod.ru
По вопросам сотрудничества и размещения рекламы пишите Администратору проекта
Ваши работы, предложения, и пожелания отправляйте по адресу: ms_kran@mail.ru