Короче понял в чём была проблема в программе. Она просто зацикливалась на ожидании приезжающих данных. (Причём непонятно почему прога висла, ведь приём в одном потоке, а интерфейс - в другом и приоритеты у них одинаковые). В 98 работает - потому что он мои настройки таймаутов на чтение из ком порта устанавливает. А ХР виснет нахрен 8) потому что для него мои тайм-ауты - филькина грамота. Он почему-то думает: "хочу - не хочу, делаю что хочу". Как ХР заставить насильно установить нужные мне таймауты ? (COMMTIMEOUTS), если функцию SetCommTimeouts он игнорирует ?
ACF_muti1atoR Повторяю: сначала нужно попробовать пообщаться с девайсом через Гипертерминал (есть такая прога в винде) чтоб исключить возможность ошибки в вашем коде. Если через терминал не получится, то можно заподозрить глючность UART, но это крайне маловероятно. Вот код, который я когда-то нашёл в борландовской справке, немного доработал и теперь активно использую в своих программах (тестировал на многих машинах): Код (Text): HANDLE hCOM; DCB dcb; COMMTIMEOUTS timeouts = {MAXDWORD,0,0,512,512}; #define COMPORT "COM1" // *** if((hCOM = CreateFile(COMPORT,GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING, 0, // асинхронный режим NULL)) == INVALID_HANDLE_VALUE) MessageBox(NULL,"Порт не открывается :-(",NULL,MB_ICONSTOP); else{ GetCommState(hCOM,&dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; if(!SetCommState(hCOM,&dcb)) MessageBox(NULL,"Порт не конфигурируется :-(",NULL,MB_ICONSTOP); else{ SetCommTimeouts(hCOM,&timeouts); PurgeComm(hCOM,PURGE_TXCLEAR | PURGE_RXCLEAR); // Тут используем порт PurgeComm(hCOM,PURGE_TXCLEAR | PURGE_RXCLEAR); CloseHandle(hCOM); } }
Quantum зачем с девайсом-то общаться ? неработает-то не он(шкаф), а прога 8). И неработает только в ХР. Кстати ни в Гипертерменале, ни в ТТY таймауты настраивать нельзя. Так бы я проверил.