Форум программистов, компьютерный форум CyberForum.ru

Общение с com-портом - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
FreezeAnti
0 / 0 / 0
Регистрация: 05.12.2008
Сообщений: 5
05.12.2008, 09:45     Общение с com-портом #1
Здравствуйте.

Мне нужно передавать и принимать информацию через компорт. Как это делалось в Win98, я знаю, делал программу. Нужно это сделать для WinXP, причем в среде разробтчика Dev-C++, там используется компилятор gcc. Не могли бы вы мне подсказать, чем отличается опрос порта в 98 и в ХР или посоветовать интернет литературу для этого.

ЗЫ в гугле нашел только примеры практически идентичные тому, что я делал для 98, и они не работают в ХР. Возможно, что-то делаю не так, но не пойму - что.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,314
05.12.2008, 10:04     Общение с com-портом #2
Ничем не отличаются.
Ты сделал правильный вывод: что-то ты делаешь не так. Но мы тоже не сможем понять, что именно ты делаешь не так, пока ты не приведешь проблемный код.
FreezeAnti
0 / 0 / 0
Регистрация: 05.12.2008
Сообщений: 5
05.12.2008, 10:26  [ТС]     Общение с com-портом #3
К сожалению, того самого кода, который работал под 98 и не работал под ХР, у меня не осталось. Сейчас привожу кусок кода, который не работает и который сделал по рекомендациям из интернета.

Код
     char address;
     std::cout << "Enter address\n";
     std::cin >> address;
     HANDLE hCom;
     COMMTIMEOUTS lpTo;
     COMMCONFIG lpCC;
     char str_com[10];
     unsigned short no_com = 0;
     hCom = 
          CreateFile("COM2, 
               GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
               FILE_FLAG_OVERLAPPED, NULL);
     GetCommState(hCom, &lpCC.dcb);
     lpCC.dcb.BaudRate = CBR_19200;
     lpCC.dcb.ByteSize = 8;
     lpCC.dcb.StopBits = ONESTOPBIT;
     lpCC.dcb.Parity = MARKPARITY;
     lpCC.dcb.fDtrControl = DTR_CONTROL_DISABLE;
     lpCC.dcb.fRtsControl = RTS_CONTROL_DISABLE;
     SetCommState(hCom, &lpCC.dcb);
     SetupComm(hCom, 2048, 2048);
     WriteFile(hCom, &address, 1, NULL, NULL);
     CloseHandle(hCom);
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,314
05.12.2008, 10:53     Общение с com-портом #4
Хорошо. А дальше? Что означает "не работает"? В чем именно это проявляется?
FreezeAnti
0 / 0 / 0
Регистрация: 05.12.2008
Сообщений: 5
05.12.2008, 10:58  [ТС]     Общение с com-портом #5
Имеется прибор. Он при получении определенного сигнала моргает лампочками. После исполнения этой программы ничего не происходит. При помощи программы COM Port Toolkit v 0.175 проверялось, что дело не в приборе.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,314
05.12.2008, 11:26     Общение с com-портом #6
Тьфу, черт! А отладчик у тебя для чего? Ладно. Побуй вот такой код (только не забудь обработать ошибки):
Код
     char address;
     std::cout << "Enter address\n";
     std::cin >> address;
     HANDLE hCom;
     COMMTIMEOUTS lpTo;
     COMMCONFIG lpCC;
     char str_com[10];
     
     unsigned short no_com = 0;
     hCom = 
          // и под Win9x, и под WinNT имя файла должно быть таким, хотя Win9x понимает и просто "COM2"
          CreateFile("\\\\.\\COM2", 
               GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
               FILE_ATTRIBUTE_NORMAL, NULL);
               // нафига тебе FILE_FLAG_OVERLAPPED? Где overlapped-структура?
     
     if (hCom != INVALID_HANDLE_VALUE)   // а вдруг порта нет или он занят уже кем-то?
     {
         if (GetCommState(hCom, &lpCC.dcb) == FALSE)
         {
             /*обработать ошибку, например:
             CloseHandle(hCom);
             return;
             */
             ;
         }
         
         lpCC.dcb.BaudRate = CBR_19200;
         lpCC.dcb.ByteSize = 8;
         lpCC.dcb.StopBits = ONESTOPBIT;
         lpCC.dcb.Parity = MARKPARITY;
         lpCC.dcb.fDtrControl = DTR_CONTROL_DISABLE;
         lpCC.dcb.fRtsControl = RTS_CONTROL_DISABLE;
         if (SetCommState(hCom, &lpCC.dcb) == FALSE)
         {
             /*обработать ошибку*/;
         }
         
         if (SetupComm(hCom, 2048, 2048) == FALSE)
         {
            /*обработать ошибку*/;
         }
         if (PurgeComm(0hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) == FALSE)
         {
            /*обработать ошибку*/;
         }
         
         // А таймауты кто ставить будет? поставить.
         
         DWORD dwBytesWritten = 0;
         if (WriteFile(hCom, &address, sizeof(address), &dwBytesWritten, NULL) == FALSE)
         {
            /*обработать ошибку*/;
         }
         if (dwBytesWritten != sizeof(address))
         {
            /*обработать ошибку*/;
         }
         CloseHandle(hCom);
     }
FreezeAnti
0 / 0 / 0
Регистрация: 05.12.2008
Сообщений: 5
08.12.2008, 15:35  [ТС]     Общение с com-портом #7
Вылетает на исполнении функции WriteFile.

Отладчик запустить не смог. Любой другой проект нормально олаживается, а этот ни в какую не хочет. Повторюсь, что использую Dev-C++.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,314
08.12.2008, 15:38     Общение с com-портом #8
Как именно вылетает? С какими симптомами, сообщениями об ошибках?

Ну почему из тебя надо все клещами под пытками вытаскивать??? Ты думаешь, участникам форума больше нужно заниматься твоим кодом, чем тебе самому???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2008, 16:25     Общение с com-портом
Еще ссылки по теме:

C++ Работа с СОМ-портом
C++ Копиляция программы работы с COM портом
Общение игрострой TCP/UDP C++
C++ Общение двух exe
Работа с COM портом C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
FreezeAnti
0 / 0 / 0
Регистрация: 05.12.2008
Сообщений: 5
08.12.2008, 16:25  [ТС]     Общение с com-портом #9
Извиняюсь, сам затупил. Ошибку уже нашел. В общем, огромное спасибо, все работает.
Yandex
Объявления
08.12.2008, 16:25     Общение с com-портом
Ответ Создать тему
Опции темы

Текущее время: 02:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru