Привет всем !!!
Люди, кто работал с COM-портом помогите разобраться в чем проблема.
Программа ждет сигнала на порт, как только сигнал пришел программа
обрабатывает его и передает обработанные данные обратно.
Проблема в том, что программа не отлавливает сигнал с порта.
Сигнал отлавливаю через WaitCommEvent.
Внизу привожу код функций, которые использую для для работы с портом.
////Инициальизация COM - порта
HANDLE __fastcall InitCOMPort(AnsiString PortName, AnsiString BDRate, AnsiString
Timeout)
{
DCB dcb;
bool fSuccess;
HANDLE hPort = CreateFile(PortName.c_str(),GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(hPort == INVALID_HANDLE_VALUE)
{
Application->MessageBoxA("Порт недоступен","Ошибка", MB_OK|MB_ICONERROR);
return INVALID_HANDLE_VALUE;
}
fSuccess = GetCommState(hPort,&dcb);
if(!fSuccess)
{
CloseHandle(hPort);
Application->MessageBoxA("Ошибка иннициализации порта","Ошибка", MB_OK|MB_ICONERROR);
return INVALID_HANDLE_VALUE;
}
dcb.BaudRate = BDRate.ToInt();
dcb.ByteSize = 7;
dcb.Parity = EVENPARITY;
dcb.StopBits = ONESTOPBIT;
fSuccess = SetCommState(hPort,&dcb);
if (!fSuccess)
{
CloseHandle(hPort);
Application->MessageBoxA("Ошибка иннициализации порта","Ошибка", MB_OK|MB_ICONERROR);
return INVALID_HANDLE_VALUE;
}
COMMTIMEOUTS cto;
cto.ReadIntervalTimeout = 0xFFFFFFFF; //// 0;
cto.ReadTotalTimeoutMultiplier = 0xFFFFFFFF;
cto.ReadTotalTimeoutConstant = 0;
cto.WriteTotalTimeoutMultiplier = 0; ////1000;
cto.WriteTotalTimeoutConstant = 0; ////1000;
bool res = SetCommTimeouts(hPort,&cto);
if(!res)
{
CloseHandle(hPort);
Application->MessageBoxA("Ошибка иннициализации порта","Ошибка", MB_OK|MB_ICONERROR);
return INVALID_HANDLE_VALUE;
}
EscapeCommFunction(hPort,CLRDTR);
Sleep(10);
EscapeCommFunction(hPort,SETDTR);
Sleep(500);
return hPort;
}
////Проверка контрольной суммы
char CheckSum(char *data)
{
char CRC=0;
int i = 0;
do
{
i++;
CRC += (char)*(data+i);
}
while(data[i] != ETX && data[i] != '\0');
CRC &= 0x7F;
return (char)CRC;
}
////Чтение COM - порта
bool ReadData(HANDLE hCom, AnsiString* Data, char Terminate, int* Stat, bool
CRC, bool mode)
{
*Data = "";
DWORD Read = 0;
char Buff = 0;
*Stat = 0;
char CheckS;
if (!mode)
{
do
{
ReadFile(hCom,&Buff,1,&Read,0);
if (Read != 0)
{
*Data += Buff;
}
else
{
*Stat = TIMEOUT_EXPIRED;
return False;
}
}
while(Buff != Terminate);
}
return True;
}
////Запись в COM - порт
bool WriteData(HANDLE hCom, AnsiString Data)
{
DWORD Written = 0;
WriteFile(hCom,Data.c_str(),Data.Length(),&Written,0);
if ((int)Written != Data.Length())
{
return False;
}
return True;
}
//>//Проблема вот в этой функции
#define BeginQuery "/?"
#define EndQuery "!\r\n"
AnsiString Identifier = "EKT7CE6850v6_3";
HANDLE hPort = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(hPort == INVALID_HANDLE_VALUE)
{
Application->MessageBoxA("Порт недоступен","Ошибка", MB_OK|MB_ICONERROR);
}
DWORD dwCommEvent;
DWORD dwRead;
char chRead;
if (!SetCommMask(hPort, EV_RXCHAR))
// Error setting communications event mask
for ( ; ; ) {
if (WaitCommEvent(hPort, &dwCommEvent, NULL)) {
do {
if (ReadFile(hPort, &chRead, 1, &dwRead, NULL))
{Stat->Lines->Add("OK");}
// A byte has been read; process it.
else
{Stat->Lines->Add("Ошибка");}
// An error occurred in the ReadFile call.
break;
} while (dwRead);
//Обработка принятого блока
// ....
// ....
//(WriteData(hPort, BeginAnswer + Identifier + EndQuery));
}
else {Stat->Lines->Add("Ошибка");}
// Error in WaitCommEvent
break;
}