| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Работа с СОМ портом |
| Автор: Maxim Prishchepa 5.12.2004, 17:00 |
| Первый раз столкнулся с проблемой - работы с СОМ портами.... естественно ни литературы, ни исходников нету.... Ковырять нечего.... Посоветуйте что можно почитать и поковырять.... (желательно в эл. виде) Заранее благодарствую.... |
| Автор: maxim1000 5.12.2004, 18:39 |
| MSDN--PlatformSDK--BaseServices--Files and I/O--Communications там есть пример работы с COM-портом или компоненты какие-нибудь поискать, но тут уж я совсем не специалист... |
| Автор: VID 29.12.2004, 16:33 |
| Если работаешь под С++Builder или Delphi, то слветую поискать в инете архив компонента Async32 от http://www.tmssoftware.com или компонент APRO 4.06 от фирмы Turbo Power. В инете есть архивы - это законченные компоненты для работы с СОМ портом. Желаю Удачи!!! |
| Автор: Гость_Alexander 11.1.2005, 12:37 |
| смотри функции API: Открыть дискриптор порта CreatFile() Получить настройки порта GetCommState () GetCommTimeouts () Изменить и сохранить SetCommState () SetCommTimeouts () Закрыть дескриптор CloseHandle () |
| Автор: Гость_Boom 26.1.2005, 04:25 |
| Только вчера закончил с этим ковыряться. Вот как открыть порт: bool TCommThread::Connect() { BOOL bResult = TRUE; hComm = CreateFile("com1", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, // эксклюзивный доступ NULL, // никакой безопасности :-) OPEN_EXISTING, 0, NULL); int m_bPortReady = SetupComm(hComm, 512, 512); // установка размера буфера DCB m_dcb; m_bPortReady = GetCommState(hComm, &m_dcb); m_dcb.BaudRate = 9600 ; m_dcb.ByteSize = 8 ; m_dcb.Parity = NOPARITY; m_dcb.StopBits = ONESTOPBIT; m_dcb.fAbortOnError = TRUE; m_bPortReady = SetCommState(hComm, &m_dcb); COMMTIMEOUTS m_CommTimeouts; m_bPortReady = GetCommTimeouts (hComm, &m_CommTimeouts); m_CommTimeouts.ReadIntervalTimeout = 50 ; m_CommTimeouts.ReadTotalTimeoutConstant = 50 ; m_CommTimeouts.ReadTotalTimeoutMultiplier = 10 ; m_CommTimeouts.WriteTotalTimeoutConstant = 100 ; m_CommTimeouts.WriteTotalTimeoutMultiplier = 0 ; m_bPortReady = SetCommTimeouts (hComm, &m_CommTimeouts); return true; } Скорость ожидания зависит от таймаутов. Почитай на microsoft.com в MSDN про структуру COMMTIMEOUTS Теперь считать: у меня операции с ком-портом запиханы в thread (так программа не подвисает) void __fastcall TCommThread::Execute() { char buf[512]; int pos = 0; Connect(); unsigned long readen; MSG msg; while( !Terminated ){ ReadFile( hComm, buf, 1, &readen, NULL ); //считываю 1 символ, чтобы время ожидания ответа не превышало ReadTotalTimeoutMultiplier*1+ReadTotalTimeoutConstant=60мс. if(readen == 1){ //в буфере еще что-то есть ReadFile( hComm, buf+1, 510, &readen, NULL ); buf[readen] = 0; SendMessage( hParentWnd, WM_USER, 0xB00B, (long)buf ); //отправлять сообщение родительской форме о факте поступления данных на COM-порт. } } Disconnect(); } теперь TCommThread::Disconnect() { CloseHandle(hComm); } типы: HANDLE hComm; HWND hParentWnd; про остальное сам додумывайся |