Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2004-10-02

Re: COM - порт

Если чего не понял, то сорри

>>//Проблема вот в этой функции

V> HANDLE hPort = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
А зачем ты порт два раза открываешь?
ты же его уже тут
HANDLE __fastcall InitCOMPort(AnsiString PortName,
AnsiString BDRate, AnsiString.....)
открыл.....

--
geg***@y*****.ru Наша музыка: тем что молчит.

Номер выпуска : 3624
Возраст листа : 376 (дней)
Количество подписчиков : 478
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/238230
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Подписан адрес:
Код этой рассылки: comp.soft.prog.prog
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru?subject=comp.soft.prog.prog

http://subscribe.ru/ http://subscribe.ru/feedback

   2004-10-02 20:51:45 (#238230)

COM - порт

Привет всем !!!
Люди, кто работал с 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;
}

   2004-10-02 15:26:07 (#238087)