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

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

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;
}

Ответить   Sat, 2 Oct 2004 18:12:49 +0600 (#238087)

 

Ответы:

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

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
А зачем ты порт два раза открываешь?
ты же его уже тут
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

Ответить   Sat, 2 Oct 2004 20:52:12 -0700 (#238230)

 

Здравствуйте, Дедка.

Sorry !!!
Я немножко не так, объяснил.

Первые четыре фунции (InitCOMPort, CheckSum, ReadData, WriteData) у
меня вынесенны в отдельный библиотечный файл "ComPort.cpp" - здесь
находится описание этих функций.

Потом этот файл линкуется с основной программой #include "ComPort.h".

А непосредственное открыте порта уже идет из другой функции.

Ответить   Sun, 3 Oct 2004 15:57:12 +0600 (#238562)

 

А.. понял(??), ты порт два раза открываешь, один раз на чтение-запись,
а другой раз для ловли посылки?


--
geg***@y*****.ru Наша музыка: тем что даже и не запущен

Номер выпуска : 3626
Возраст листа : 378 (дней)
Количество подписчиков : 476
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/238825
Получить правила : 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

Ответить   Mon, 4 Oct 2004 02:38:13 -0700 (#238825)

 

Здравствуйте, Дедка.

Нет порт открывается один раз, второй раз его открыть не возможно, пока
он не закрыт функцией открывшей его, поэтому открытие его происходит
на глобальном уровне, чтобы был доступен другим функциям.

Проблема в том в функции WaitCommEvent при запуске программы проверяет
нет ли сигнала на входе, и если его нет, то просто завершается, хотя
по идее она должна все время прослушивать порт, и если пришел сигнал
обрабатывать его.

И я не знаю толи я с тайм-аутами премудрил, толи криво функцию
использую.

Ответить   Tue, 5 Oct 2004 01:38:43 +0600 (#239329)

 

Ага, настройка ком-порта .. это отдельная песня....
А чего ты не хочешь в отдельном потоке читать из порта и если чего
пришло обрабатывать полученное?
--
geg***@y*****.ru Наша музыка: тем что даже и не запущен

Номер выпуска : 3648
Возраст листа : 384 (дней)
Количество подписчиков : 480
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/242219
Получить правила : 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

Ответить   Sun, 10 Oct 2004 00:03:17 -0700 (#242219)