Форум программистов CodeGuru
19 Январь 2018, 09:10:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с устройством через СОМ порт  (Прочитано 15455 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Jj
Новичок
*
Офлайн Офлайн

Сообщений: 1


Просмотр профиля
« : 01 Ноябрь 2009, 02:52:13 »

Здравствуйте, помогите пожалуйста дилетанту.
Мне требуется управлять устройством ввода-вывода через COM порт.
Работаю на дельфи, использую WinAPI. Потренировался сначала соединив 2 порта, отправлял строку с СОМ1 на СОМ2. Ура ..получилось. Только один нюанс странный - ReadFile, заполняет правильно параметр "количество принятых байтов", а у WriteFile параметр "количество отправленных данных" равен нулю, почему нулю!?
Теперь подключаю устройство, и не получается.
                                  Как я это делаю(конспект):
  1) Порт открываю через структуру OVERLAPPED
hPort := CreateFile('COM1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
  2) Настраиваю параметры между портом и устройством по скорости, паритету, размеру байта и кол-ву стоповых бит
  GetCommState(hPort, DCB) ;
  DCB.BaudRate := CBR_9600;
  DCB.Parity := NOPARITY;    
  DCB.ByteSize := 8;        
  DCB.StopBits := ONESTOPBIT;
  SetCommState(hPort,DCB);
  PurgeComm(hPort, PURGE_TXCLEAR or PURGE_RXCLEAR);
  3) устанавливаю событие на прием символа(ов)
  SetCommMask(hPort, EV_RXCHAR);
  4)Запускаю отдельный поток с ожиданием этого события и чтения данных
    WaitCommEvent(hPort, dwMask, @OverRead) ;
    ReadFile(hPort, Buf, dwRead, dwRead, @OverRead);
  5)Ну и наконец пытаюсь сгенерировать это событие из главного потока.
  Нахожу в описании устр-ва команду $AA2(cr), которая позволяет считать сведения о его конфигурации.
  Отправляю команду так 
  WriteFile(hPort, WriteBytes,  SizeOf(WriteBytes), dwWrite, @OverWrite)
  , где значение WriteBytes = '$002'+chr(13).
  Функция выполняется успешно, значение dwWrite=0, т.е. как и в опытах с 2-мя портами(см.выше), но там то чтение было успешным.
В описании сказано, что ответ может не прийти из-за синтаксической или коммуникационной ошибки.
Проблема в том, что событие SetCommMask(hPort, EV_RXCHAR) не наступает, нет ответа от удаленного устройства.
Буду очень благодарен за помощь.



« Последнее редактирование: 01 Ноябрь 2009, 03:04:23 от Jj » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!