C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Com-порт, что не так?
Amir_Jan
Отправлено: 23.10.2006, 16:32


Ученик-кочегар

Группа: Участник
Сообщений: 8



Уважаемые объясните пожалуйста, что в коде не так. Подсоеденил к COM-порту разъем DB-9 с закороченными выводами входных и выходных данных, т.е. выходные данные сразу попадают во входной буфер. В пошаговом режиме работает как надо. Считываю отсылаемый байт и все в порядке. А при запуске программы вылетает при выполнении функции WaitCommEvent(), да и считывает какие-то левые данные.
Вот часть кода:
HANDLE hCOM;
//---------------------------------------------------------------------------
//старт процесса
void __fastcall TForm1::Button1Click(TObject *Sender)
{
start = true;
//открываем порт*************************************************************
hCOM = CreateFile(NamePort.c_str(),
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
if (GetLastError() != NO_ERROR) //проверка RetCode (д.б. нуль)
//The function CreateFile fails
}
//DCB************************************************************************
GetCommState();
...
SetCommState();
//COMMTIMEOUTS***************************************************************
GetCommTimeouts();
...
SetCommTimeouts();
//сброс порта****************************************************************
PurgeComm(hCOM, набор флагов);
//маска событий порта********************************************************
SetCommMask(hCOM, EV_RXCHAR | EV_TXEMPTY));
//создание объекта "событие"*************************************************
hEvent = CreateEvent(NULL,
true,
false,
NULL);
OVERLAPPED myOL;
myOL.hEvent = hEvent;
//запись/чтение байта из порта***********************************************
TBuf = 0xFF; //отправляемый байт (перевод прибора в активный режим)
do
{
TBuf++;
f_Write();
DWORD wcEvent = 0; //код события
RetCode = WaitCommEvent(hCOM, &wcEvent, &myOL); //перевод процесса в фоновый режим
if ((!RetCode) && GetLastError() == ERROR_IO_PENDING)
{
if (WaitForSingleObject(hEvent, 5000) == WAIT_OBJECT_0) //ожидание события
{
GetOverlappedResult(hCOM, &myOL, &NumByteTrans, false);
if (wcEvent & EV_TXEMPTY)
{
;
}
if (wcEvent & EV_RXCHAR)
{
f_Read(); //чтение байта
}
}
else
{
Label2->Caption = "The function WaitForSingleObject fails";
start = false;
}
}
else
{
Label2->Caption = "The function WaitCommEvent fails";
start = false;
}
Application->ProcessMessages();
ByteCount++; //увеличение счетчика переданных байт
Label1->Caption = IntToStr(ByteCount);
} while (start);

if (!EscapeCommFunction(hCOM, CLRRTS)) //сбрасывам сигнал RTS
f_ShowErr("The function EscapeCommFunction (CLRRTS) fails");
fEvent = false; //сброс флага fEvent
fPort = false; //сброс флага fPort
CloseHandle(hEvent); //объект "событие" разрушен
CloseHandle(hCOM); //порт закрыт
}
//---------------------------------------------------------------------------
//функция записи одного байта в порт
void TForm1::f_Write()
{
NumByteWr = 0; //количество записанных байт
if (!WriteFile(hCOM, &TBuf, 1, &NumByteWr, &myOL))
{
if (GetLastError() != ERROR_IO_PENDING)
{
Label2->Caption = "The function WriteFile fails";
start = false;
ResetEvent(hEvent);
fWR = false;
return;
}
}
ResetEvent(hEvent);
fWR = true;
}
//---------------------------------------------------------------------------
//функция чтения одного байта из порта
void TForm1::f_Read()
{
ErrorMask = 0; //сюда будет занесен код ошибки порта, если таковая была
if (!ClearCommError(hCOM, &ErrorMask, &myCS))
f_ShowErr("The function ClearCommError fails");
if (ErrorMask)
{
ResetEvent(hEvent);
fRD = false;
return;
}
NumByteRd = 0;
if (!ReadFile(hCOM, &RBuf, myCS.cbInQue, &NumByteRd, &myOL))
{
if (GetLastError() != ERROR_IO_PENDING)
{
f_ShowErr("The function ReadFile fails");
start = false;
ResetEvent(hEvent);
fRD = false;
return;
}
}
Memo1->Lines->Add(IntToHex(TBuf, 2) + "\t" + IntToHex(RBuf, 2));
ResetEvent(hEvent);
fRD = true;
}
Кто может обясните пожалуйста...
ДИванников
Отправлено: 31.10.2006, 13:05


Ученик-кочегар

Группа: Участник
Сообщений: 1



У меня было что-то на подобии и есть предположение, что дело в задержке между записью и чтением байта. Когда Вы отлаживаете программу пошагово, то такая задержка получается на автомате. Поставьте Sleep(10) скажем между функциями.
Amir_Jan
Отправлено: 01.11.2006, 06:41


Ученик-кочегар

Группа: Участник
Сообщений: 8



Пришлось вставить Sleep, помогло, спасибо.

Вернуться в Работа с внешними устройствами