|
Работа с СОМ портом, Win2000 |
|
|
|
Feb 3 2005, 09:12
|
Группа: Новичок
Сообщений: 7
Регистрация: 3-02-05
Пользователь №: 2 395

|
Здравствуйте, уважаемые! Если кто сталкивался, помогите плизз. Долбаюсь уже 2 недели, и ничего не получается. Ситуация следующая: Есть некий контроллер и общается он с компьютером через RS232, в Win98 все работает, а вот Операционка Win2000 блокирует прямое обращение к портам. Мне подсказали прогу WinDriver для обхода этой проблемы... но опять-же, для LPT порта там есть стандартная заготовка, которая прекрасно работает... а о СОМ порте ни слова. Сразу оговорюсь, я не являюсь системным программистом и с железом дел никогда не имел... а тут пришлось  Искренне надеюсь на Вашу помощь. Заранее спасибо. З.Ы. Я впервые на этом форуме, и вполне возможно что запостил тему не совсем в тот раздел куда следовало бы. ЗЗ.ЫЫ Работать с этой штукой через CreateFile/ReadFile/WriteFile тоже не получается, в ReadFile постоянно нули возвращаются, хотя команда сформирована верно и контроллером принята...
|
|
|
|
|
 |
Ответов
|
Jul 7 2005, 06:54
|
Частый гость
 
Группа: Свой
Сообщений: 107
Регистрация: 27-06-05
Из: Россия
Пользователь №: 6 324

|
Вот примерчик для Borland C++ Builder из моей тестовой программки. hCOM, dcb, и sTO обьявлены глобально ( HANDLE hCOM, DCB dcb, COMMTIMEOUTS sTO), в классе MainForm, cbBaudRate - комбо-бокс на главной форме с выбором скорости обмена.
int __fastcall TMainForm::InitComm(int portno) ///////////////////////////////////////////////////////////////////////////// // // Инициализация COM-порта с номером portno. Если инициализация прошла // успешно, то функция возвращает 0, в противном случае один из следующих // кодов: // -1 не удалось получить доступ к COM-порту // -2 не удалось получить доступ к блоку dcb // -3 не удалость перенастроить порт // -4 ошибка при настройке тайм-аутов // ///////////////////////////////////////////////////////////////////////////// { char portname[8]; int result; DWORD val;
sprintf(portname,"COM%d",portno); //
hCOM = CreateFile( portname, // GENERIC_READ|GENERIC_WRITE, // Пробуем получить доступ 0, // к COM-порту NULL, // OPEN_EXISTING, // FILE_ATTRIBUTE_NORMAL, // NULL // );
if( hCOM != INVALID_HANDLE_VALUE ) {//*1*----------------------------------------------------------------- // Настройка параметров порта //-------------------------------------------------------------------- if( GetCommState(hCOM,&dcb) ) {//*2* switch( cbBaudRate->ItemIndex ) { case 0: { dcb.BaudRate=CBR_4800; break; } case 1: { dcb.BaudRate=CBR_9600; break; } case 2: { dcb.BaudRate=CBR_19200; break; } case 3: { dcb.BaudRate=CBR_38400; break; } case 4: { dcb.BaudRate=CBR_57600; break; } case 5: { dcb.BaudRate=CBR_115200; break; } default: dcb.BaudRate=CBR_9600; }// end of switch (cbxBaudRate)
dcb.ByteSize = 8; // в байте 8 битов dcb.fBinary = True; // альтернативы как бы нет
dcb.fNull = False; //
dcb.fOutxCtsFlow = False; // disable TS output flow control dcb.fOutxDsrFlow = False; // disable DSR output flow control dcb.fErrorChar = False; // disable error replacement
dcb.fAbortOnError = True; // abort reads/writes on error
dcb.fDtrControl = DTR_CONTROL_DISABLE; // DTR flow control disable dcb.fRtsControl = RTS_CONTROL_DISABLE; // RTS flow control dcb.fDsrSensitivity = False; // DSR sensitivity disable
dcb.fOutX = False; // disable XON/XOFF out flow control dcb.fInX = False; // disable XON/XOFF in flow control
dcb.XonLim = 256; // transmit XON threshold dcb.XoffLim = 2048; // transmit XOFF threshold
dcb.XonChar = 0x7F; // Tx and Rx XON character dcb.XoffChar = 0x7F; // Tx and Rx XOFF character
dcb.EvtChar = 0x02; // received event character dcb.ErrorChar = 0x00; // error replacement character dcb.EofChar = 0x03; // end of input character
dcb.fTXContinueOnXoff = False; // XOFF continues Tx (????)
if( !SetCommState(hCOM, &dcb) ) { CloseHandle(hCOM); hCOM = INVALID_HANDLE_VALUE; return( -3); } } else { CloseHandle(hCOM); hCOM = INVALID_HANDLE_VALUE; return( -2); }//*2*
}//*1* else return( -1);
//--------------------------------------------------------------------- // Настройка тайм-аутов //---------------------------------------------------------------------
if( GetCommTimeouts(hCOM, &sTO) ) { sTO.ReadTotalTimeoutConstant = 250; sTO.ReadTotalTimeoutMultiplier = 3; sTO.ReadIntervalTimeout = 2; sTO.WriteTotalTimeoutConstant = 100; sTO.WriteTotalTimeoutMultiplier = 5;
if( !SetCommTimeouts( hCOM, &sTO ) ) { CloseHandle( hCOM ); hCOM = INVALID_HANDLE_VALUE; return( -4); } } else { CloseHandle(hCOM); hCOM = INVALID_HANDLE_VALUE; return( -4); }
PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ClearCommError(hCOM,&val,NULL);
return( 0 ); }//<<< End of InitComm() >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Ну а дальше через функции ReadFile и WriteFile. 1. Передача:
len = 5; fSucs = WriteFile( hCOM, &txbuf[0], len, &len, NULL );
if( !fSucs ) { Errors = CE_BREAK|CE_FRAME|CE_IOE|CE_MODE|CE_OVERRUN|CE_RXOVER|CE_RXPARITY|CE_TXFULL; ClearCommError(hCOM, &Errors, NULL); }
2. Прием:
len = 5; fSucs = ReadFile( hCOM, &rxbuf[0], len, &len, NULL );
if( fSucs && (len==5) ) { принято } else { сбросить ошибки как при передаче}
Количество принятых байт проверять желательно, так как иногда функция возвращает вроде все ОК, хотя считано 0 байтов. Что это за глюк не разбирался.
По переключению RTS. Автоматический вариант проходит - сам когда-то писал утилитку для заливки в кассу базы товаров по 485 интерфейсу. Долго мучался, но в конце-концов разобрался - хитрость там какая-то с настройками com-порта, давно это было, попрбую найти в архивах примерчик.
|
|
|
|
Сообщений в этой теме
uvw Работа с СОМ портом Feb 3 2005, 09:12 IgorKossak Попробуйте следуюшее в прикреплённом файле.
У меня... Feb 3 2005, 09:23 uvw Спасибо, но эту статью я недавно читал (на сайте w... Feb 3 2005, 10:11 IgorKossak Зачем такие сложности с прямым доступом если и чер... Feb 3 2005, 10:59 uvw Могу привести исходник на паскале, присланный разр... Feb 3 2005, 11:36 veter а вы попробуйте RxD и TxD закоротить, и отправить ... Feb 3 2005, 13:37 uvw Фуухх, я уже окончательно запутался....
выкладываю... Feb 3 2005, 15:39 DPL Цитата(uvw @ Feb 3 2005, 18:39)а вот что прои... Feb 4 2005, 06:16 veter Our_DCB.fDtrControl = DTR_CONTROL_ENABLE;
этой на... Feb 3 2005, 17:13 uvw При установке DTR_CONTROL_DISABLE данные на контро... Feb 3 2005, 17:37 veter я бы отправил тебе свои исходники, да у меня как р... Feb 3 2005, 17:46 uvw veter, Давай, буду очень признателен
присылай на ... Feb 3 2005, 17:51 khach При порты в прикладной программе забудьте- это при... Feb 4 2005, 10:52 Shedon Здесь есть класс для работы с ком портом, у меня ч... Feb 4 2005, 10:17 Shedon [khach], естественно из прикладной программы с пор... Feb 4 2005, 11:20 khach Цитата(Shedon @ Feb 4 2005, 13:20)[khach], ес... Feb 4 2005, 11:38 andk >Вопрос- есть жизненно необходимая прога, управ... Feb 4 2005, 12:36 khach Цитата(andk @ Feb 4 2005, 14:36)Скорее всего ... Feb 4 2005, 13:47  -Tумблер- Цитата(khach @ Feb 4 2005, 16:47)98-дает, Мил... Feb 7 2005, 12:49 uvw пожалуй, DPL прав! скорее всего так и происход... Feb 4 2005, 21:09 andk Цитата(khach @ Feb 4 2005, 19:47)Цитата(andk ... Feb 5 2005, 04:40 one_man_show Попробуйте скачать отсюда Torry компонент для Дель... Feb 7 2005, 13:20 Dimonira Как я понял из всего сказанного, у человека порт к... Feb 9 2005, 06:15 _Sam_ ЦитатаПри установке DTR_CONTROL_DISABLE данные на ... Feb 9 2005, 07:22 SergM Здравствуйте.
Есть не плохая книга: П. Агуров ... Feb 9 2005, 11:58 makc GiveIo с некоторыми программами ведет себя очень с... Feb 9 2005, 12:36 andk Прикол всех этих псевдо драйверов в том, что они п... Feb 9 2005, 13:18 SergM Цитата(andk @ Feb 9 2005, 16:18)Прикол всех э... Feb 9 2005, 13:57 Dimonira Мужики, вы, похоже так и не поняли. Дело не в умен... Feb 15 2005, 08:33 SergM Цитата(Dimonira @ Feb 15 2005, 11:33)Мужики, ... Feb 15 2005, 08:58  khach Как автор подтопика о программаторе, уточню. Не ра... Feb 15 2005, 10:11   -Tумблер- Цитата(khach @ Feb 15 2005, 13:11)Не работает... Feb 17 2005, 18:40 Dimonira Я как-то пропустил слова о реверс-инжиниринге.
Тог... Feb 16 2005, 11:23 Serjio Мы пользуемся CPORT под все Windows Feb 17 2005, 08:01 Angel может кому пригодиться h__p://www.rs232.ru/ Mar 3 2005, 11:54 PowerF1 Подскажите, у меня такая проблема.
Когда собирал м... Mar 18 2005, 15:59 _VM Программируй на C++Builder - меньше заморачиваться... Mar 23 2005, 17:01  -Tумблер- Цитата(_VM @ Mar 23 2005, 20:01)заводишь пото... Mar 28 2005, 11:05   _VM Цитата(-Tумблер- @ Mar 28 2005, 14:... Mar 29 2005, 00:20    -Tумблер- Цитата(_VM @ Mar 29 2005, 03:20)А я что-то не... Mar 29 2005, 06:04    -Tумблер- Цитата(_VM @ Mar 29 2005, 03:20)А я что-то не... May 24 2005, 10:44 Lukomor Подскажите пожалуйста! Есть проблема работы с ... Mar 28 2005, 07:40 _VM Если протокол связи накладывает жесткие временные ... Mar 28 2005, 09:19  Lukomor Спасибо _VM за ответ.
Цитата(_VM @ Mar 28 200... Mar 29 2005, 05:36   -Tумблер- Цитата(Lukomor @ Mar 29 2005, 08:36)В протоко... Mar 29 2005, 07:35    Lukomor Цитата(-Tумблер- @ Mar 29 2005, 10:... Mar 29 2005, 09:22     -Tумблер- Цитата(Lukomor @ Mar 29 2005, 12:22)Настройка... Mar 30 2005, 11:52      Lukomor Цитата(-Tумблер- @ Mar 30 2005, 14:... Mar 31 2005, 06:38       -Tумблер- Цитата(Lukomor @ Mar 31 2005, 09:38)Цитата(... Apr 13 2005, 16:22        -Tумблер- Цитата(-Tумблер- @ Apr 13 2005, 19:... Apr 13 2005, 16:37         Lukomor Цитата(-Tумблер- @ Apr 13 2005, 19:... Apr 21 2005, 08:59          -Tумблер- Цитата(Lukomor @ Apr 21 2005, 11:59)Для работ... Apr 21 2005, 13:29           Lukomor Цитата(-Tумблер- @ Apr 21 2005, 16:... Apr 22 2005, 07:34            yuriyc [/quote]
Так REALTIME_PRIORITY_CLASS это вроде и... May 25 2005, 05:52             Lukomor Цитата(yuriyc @ May 25 2005, 08:52)Обратимся ... Jun 22 2005, 11:46              yuriyc [/quote]
2all:
Кто нибудь знает, каким образом мо... Jun 28 2005, 13:26               vm1 Мне кажется из под Win управлять RTS дело безнадеж... Jun 28 2005, 14:04               Lukomor Цитата(yuriyc @ Jun 28 2005, 16:26)Как вариан... Jun 29 2005, 07:03                vm1 а есть возможность передавайть последний байт тран... Jul 4 2005, 13:11   _VM 2Lukomor
Цитата(Lukomor @ Mar 29 2005, 08:36)... Mar 30 2005, 21:04    _VM 2-Tумблер-&PowerF1&Lukomor
Проблем с разны... Mar 30 2005, 21:45    Lukomor 2_VM
Цитата(_VM @ Mar 31 2005, 00:04)Пуск-... Mar 31 2005, 06:59     _VM Если владеешь C++ поищи Numega Driver Studio (софт... Mar 31 2005, 08:47 SergM А для отладки софта, работающего с СОМ под Windows... Mar 28 2005, 13:44 PowerF1 _WM, боьшое спасибо за ценную информацию!
Разо... Mar 29 2005, 14:41 -Tумблер- Цитата(PowerF1 @ Mar 29 2005, 17:41)Как распр... Mar 30 2005, 10:53 max123 Цитата(uvw @ Feb 3 2005, 14:12)Здравствуйте, ... Apr 5 2005, 05:42 fluent Помогите плиз.
Взялся за курсовик.Для начала надо ... Apr 2 2007, 00:55 haker_fox Цитата(fluent @ Apr 2 2007, 06:55) Помоги... Apr 2 2007, 09:21 Djimmy Запоздало, но тем не менее.. Jun 23 2007, 17:13 dimka76 Цитата(Djimmy @ Jun 23 2007, 21:13) Запоз... Aug 31 2009, 11:05 MaxPIC Я делал так в Visual Studio 2005:
Инициализация:
... Jul 1 2007, 11:15 MMP Подскажите как cport310 прицепить к Borland Aug 8 2007, 06:58 badik Судя по Вашей переписке - лето было боевое.
Есть о... Aug 28 2007, 13:25 Hmm Цитата... классный класс. Да неплохой. Использовал... Mar 28 2012, 19:34 dm37 в архиве cport310 есть файл readme.txt всё (правда... Sep 26 2016, 18:45
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|