Добрый день, Знатоки!
Пишу на Borland C++ 6, Win XP.
Работаю с COM RS485 портом.
Код программы:
Com1Port=CreateFile("COM5",GENERIC_READ|GENERIC_WRITE,
0,// устройство связи должно быть открыто для монопольного доступа
NULL,// нет атрибутов защиты
OPEN_EXISTING, // cустройства связи должен использовать OPEN_EXISTING
0, // нет перекрытый с I/O
NULL); // для коммуникационных устройств параметр hTemplate должен быть NULL
if(Com1Port==INVALID_HANDLE_VALUE) ShowMessage("Порт COM5 занят ");
// Установвить размер буфера:
SetupComm( Com1Port, 1024, 1024 );
// Очистить буфер
PurgeComm( Com1Port, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
// Задать установки таймаута
ct.ReadIntervalTimeout=2;
ct.ReadTotalTimeoutMultiplier=1;
ct.ReadTotalTimeoutConstant=MAXDWORD;
ct.WriteTotalTimeoutMultiplier=1;
ct.WriteTotalTimeoutConstant=1000 ; //MAXDWORD;
fSuccess = SetCommTimeouts(Com1Port,&ct); // timeout
if (!fSuccess) ShowMessage ("( Error SetCommTimeouts)");
// Получить текущую конфигурацию.
fSuccess = GetCommState(Com1Port, &dcb);
dcb.BaudRate = CBR_38400; // устанавливаем скорость
dcb.ByteSize = 8; // размер данных xmit, и rcv
dcb.Parity = NOPARITY; // нет бита четности
dcb.StopBits = ONESTOPBIT; // один стоп-бит
dcb.EofChar = '}';
// setup hardware flow control
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fOutxDsrFlow = 0;
dcb.fOutxCtsFlow = 0;
// Установить текущую конфигурацию.
fSuccess=SetCommState( Com1Port, &dcb );
if (!fSuccess) ShowMessage ("(Set_CommState)");
// Послать запрос в файл
fSuccess = WriteFile(Com1Port, Buffer, Size, &dw,NULL);
if (!fSuccess) ShowMessage (" Error WriteFile ");
for (i=0; i<100; i++) // ждем ответ
{
ClearCommError(Com1Port, & Errors, & Stat);
if (Stat.cbInQue > 0 ) break; // буфер порта
Sleep(10); // ждать
}
// гарантированно пришел ответ
dw = 0;
fSuccess=ReadFile(Com1Port, Buffer, 100 , &dw, NULL);
if (dw > 0)
после принятия данных из порта в Buffer, уходим на обработку данных. И вроде все хорошо...
Каждые 5 секунд я запускаю таймер, который считывает данные из порта. Все работает.
Закрываю порт я по завершению работы программы по событию OnClose.
Но со мной в группе работает еще один парень, который тоже пишет программы для работы с этим же портом COM5.
После того как отработает программа этого парня, "перестает" работать моя программа, а именно:
ClearCommError(Com1Port, & Errors, & Stat);
if (Stat.cbInQue > 0 ) break; // буфер порта
Stat.cbInQue
всегда равен нулю.
И помогает мне только перезагрузка компа. Только после полной перезагрузки компа моя программа опять работает нормально.
Так вот вопрос: какую команду (или набор команд) мне нужно подать в порт, чтобы не перезагружать компьютер всякий раз, когда мне нужно поработать?