Форум — Ответы ( К темам )
? | Igos: Работа с СОМ портами под Win XP (26-03-2003 09:19:31) |
Есть проблемы в получении данных с СОМ-порта под XP, при занятом порте прога выдает Shared violation. Кто может поможите. | |
Георгий (26-03-2003 09:31:33) | |
1 если ты работаешь через порт с какой либо железкой, то кто её может, кроме тебя, занять? 2 если порт всё же кто-то занял, то может не надо ему мешать, перемешивая его пакеты со своими? 3 если очень хочется то установи флаг разделяемого использования порта при открытии... | |
NIKE (26-03-2003 14:55:24) | |
Хорошо, а как вообще с КОМ-порта считать/записать ?
| |
Георгий (26-03-2003 19:28:34) | |
NIKE Эээ ходят слухи, что тот, кто ищет может (всегда) что-то найти... | |
Владимир (26-03-2003 20:20:33) | |
Работаем с портом, как с файлом Открываем его и читаем или пишем. HANDLE h; h = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (h == INVALID_HANDLE_VALUE) { ShowMessage("Порт не найден"); return; } DWORD d; ClearCommError(h, &d, NULL); ClearCommBreak(h); и дальше читаем, пишем в этот порт, например: char Buff[200]; DWORD cd; .... WriteFile(h, Buff, 18, &cd, NULL); ReadFile(h, Buff, 2, &cd, NULL); ... | |
Igos (27-03-2003 09:13:46) | |
Re Георгий : Проблема заключается в том, что под 95,98,2000 все работает : прога проверяет готовность у-ва к скидыванию, если видит что на порте висит у-во то готовит порт и принимает данные. Под ХР — до тех пор пока не подключаешь к порту у-во — все работает, дальше — "шаред ..." Re Владимир : Все дело в том, что примерно так у меня все и сделано, и тем не менее. Говорят что ХР не дает напрямую к портам обращатся и якобы надо через какие то спецательные драйвера. | |
Георгий (27-03-2003 12:48:46) | |
как я понимаю постановку задачи (с точностью до подробностей): 1. есть датчик (железка, которая по RS 232 или какому нибудь другому протоколу тупо формирует пакеты) 2. есть компьютер к которому железку то подключат, то отключат 3. нужна прога, которая данные датчика до оператора доносит сразу возникают вопросы: 1. какой протокол управления потоком (программный (XON / XOFF), аппаратный (RTS / CTS) или никакой (т.е. либо самодельный либо игнор. переполнений и т.п.)) 2. выполняется ли корректная работа с портом: CreateFile BuildCommDCB SetCommState SetCommTimeouts ... чтение / запись ... CloseHandle Кстати специально проверил работу своей программы и эмулятора устройства: 1. есть промышленный контроллер (RS 232c + отсутствие управления потоком + принцип запрос — ответ), но не у меня — я использую программу — эмулятор (2 COM порта одного компьютера соединяю zero-modem кабелем, с одним портом работает эмулятор контроллера (написанный тоже мною), а с другим основная программа) 2. вне зависомости от порядка присоединения / отсоединения программ / шнурков к портам работает всё под всей линейкой win9x и 2000 / XP (специально только что проверил) Кстати2 : возможно срабатывает PnP и XP начинает искать новые железки на порту и, возможно, находит (но это ты уже должен сам ответить — я где то у себя видел описание PnP для COM портов, но не могу найти) | |
AndreyAGSoft (27-03-2003 15:34:39) | |
1. Используй WinIO -всё работает под всеми виндами. 2. Используй компоненты . Например CommPort от WinSoft http://www.winsoft.sk | |
Igos (27-03-2003 18:03:49) | |
To Георгий: У у-ва есть буфер событий при подсоединении к компу оно начинает тупо туда все скидывать но это не суть важно. никаких PnP по идее и быть не должно. Чем ХР по этой идее от 2000 отличается я вообще пока уловить не могу. Если у тебя написана прога одинаково работающая и под ХР и под 98 то только скажи, я попробую все ломом вставить и пусть работает. То AndreyAGSoft: за WinIO Thanks! буду пробовать. если работал подскажи, не тормозится ли работа приложения, мне актуально realtime (по крайней мере почти) | |
Igos (27-03-2003 18:09:42) | |
То Георгий: как ты открываешь и закрываешь порт, возможно у меня не корректно проходит инициализация порта, во всяком случае под 2000 у меня сначала именно с инициализацией были проблемы.
| |
Igos (27-03-2003 18:14:41) | |
То Allem: Еще вопрос — на старых branda'х не мог привязать прогу к железу, то ли у них VolSerNum не как у людей, то CryptoApi ключей не возвращает. Пришлось вертаться к старому доброму XOR'у, это так только у меня непутевого или все-таки были прецеденты.
| |
Igos (27-03-2003 18:16:16) | |
То Георгий: как ты открываешь и закрываешь порт, возможно у меня не корректно проходит инициализация порта, во всяком случае под 2000 у меня сначала именно с инициализацией были проблемы.
| |
Igos (27-03-2003 18:16:26) | |
To Георгий: У у-ва есть буфер событий при подсоединении к компу оно начинает тупо туда все скидывать но это не суть важно. никаких PnP по идее и быть не должно. Чем ХР по этой идее от 2000 отличается я вообще пока уловить не могу. Если у тебя написана прога одинаково работающая и под ХР и под 98 то только скажи, я попробую все ломом вставить и пусть работает. То AndreyAGSoft: за WinIO Thanks! буду пробовать. если работал подскажи, не тормозится ли работа приложения, мне актуально realtime (по крайней мере почти) | |
Георгий (28-03-2003 00:12:50) | |
изрезанный кусок кода отвечающий за инициализацию: _COMMTIMEOUTS ctmo; DCB dcb; COMMCONFIG cc; cc.dwSize=sizeof (COMMCONFIG); cc.wVersion=1; cc.dwProviderSubType=PST_RS232; cc.dwProviderOffset=0; cc.dwProviderSize=0; //ïî íåïîíÿòíûì ïðè÷èíàì ôóíêöèÿ BuildCommDCB íå çàïîëíÿåò ÂÑÅ ïîëÿ //ñòðóêòóðû îïèñàíèÿ êîíòåêñòà óñòðîéñòâà òàê ÷òî çàïîëíÿåì èõ //ñâîèìè ðóêàìè (êîïèÿ òîãî, ÷òî óñòàíàâëèâàåò CommConfigDialog) dcb.DCBlength=28; dcb.BaudRate=38400; dcb.fBinary=1; dcb.fParity=1; dcb.fOutxCtsFlow=0; dcb.fOutxDsrFlow=0; dcb.fDtrControl=1; dcb.fDsrSensitivity=0; dcb.fTXContinueOnXoff=0; dcb.fOutX=0; dcb.fInX=0; dcb.fErrorChar=0; dcb.fNull=0; dcb.fRtsControl=0; dcb.fAbortOnError=0; //dcb.wReserved;//ýòî ïîëå ïî íåïîíÿòíûì ïðè÷èíàì íå íàõîäèò êîìïèëÿòîð *(&dcb.BaudRate+2)=0;//ïðèõîäèòñÿ îáíóëÿòü òàêèì îáðàçîì dcb.XonLim=2048; dcb.XoffLim=512; dcb.ByteSize=8; dcb.Parity=0; dcb.StopBits=2; dcb.XonChar=17; dcb.XoffChar=19; dcb.ErrorChar=0; dcb.EofChar=0; dcb.EvtChar=0; if (hCom!=INVALID_HANDLE_VALUE) CloseHandle(this->hCom); this->hCom=CreateFile( ComName.c_str(), GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (!BuildCommDCB(CfgString.c_str(),&dcb)) ShowLastError(); if (!SetCommState(this->hCom,&dcb)) ShowLastError(); ctmo.ReadIntervalTimeout=0; ctmo.ReadTotalTimeoutMultiplier=0; ctmo.ReadTotalTimeoutConstant=d->GetInputTimeOut(); ctmo.WriteTotalTimeoutMultiplier=0; ctmo.WriteTotalTimeoutConstant=d->GetOutputTimeOut(); SetCommTimeouts(hCom,&ctmo); запись чтение: PurgeComm(this->hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); WriteFile(hCom,this->OutPutBuffer,4+size+2,&nBytes,NULL); ReadFile(hCom,this->InPutBuffer,4+size+2,&nBytes,NULL); закрытие: CloseHandle(hCom) Можешь создать ветку и рассказать о привязке ПО к машине? | |
Георгий (28-03-2003 00:13:34) | |
опять муть вместо комментариев — что делать?
| |
Igos (28-03-2003 09:14:12) | |
То Георгий: За кусок спасибо, буду мучится. Если интересно насчет привязки могу на мыло, или все таки выдвигать тему?
| |
Георгий (28-03-2003 09:54:24) | |
Я думаю привязка многим может пригодится — делай тему, а потом Владимир разберётся, что с ней делать (в смысле FAQ или ещё что-нибудь).
|