VC++ Com port problem

3 отговора 90 прегледа
#1

VC++ Com port problem

void CChetene::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
HANDLE hCom = INVALID_HANDLE_VALUE;
DCB dcb;
COMMTIMEOUTS cto;
OVERLAPPED ovrRead;
HANDLE hReadThread;
DWORD dwReadThreadId;
BOOL fSuccess;
char mdmData[512];
DWORD bytesRW;
CString mtx;
int i[20];
hCom = CreateFile("COM1",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);
if (hCom == INVALID_HANDLE_VALUE) {
AfxMessageBox("Error opening comm device !!!");
return;
}
if (!GetCommState(hCom,&dcb)) {
AfxMessageBox("GetCommState failed!");
return;
}
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fAbortOnError = 1;
if (!SetCommState(hCom,&dcb)) {
AfxMessageBox("Error set comm state !!!");
return;
}
if (!GetCommTimeouts(hCom,&cto)) {
AfxMessageBox("Error get commtimeouts !!!");
return;
}
cto.ReadIntervalTimeout = 0xFFFFFFFF;
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant = 1000;
if (!SetCommTimeouts(hCom,&cto)) {
AfxMessageBox("Error setting commtimeouts !!!");
return;
}
if (!SetupComm(hCom,4096,4096)) {
AfxMessageBox("Error Setup Comm !!!");
return;
}
if (!SetCommMask(hCom,EV_RXCHAR)) {
AfxMessageBox("SetCommMask failed");
return;
}
// --Kraj na inicializaciq
//while(1) {
memset(mdmData, '\0', sizeof(mdmData));
fSuccess = ReadFile(hCom,mdmData,sizeof(mdmData),&bytesRW,0);
if (!fSuccess) {
mtx.Format("ReadFile failed with error %d.", GetLastError());
return;
//AfxMessageBox(mtx);
}
i[0] = (int)mdmData[0] & 0x0f;
i[1] = (0x0f & (int)mdmData[1]);
i[2] = (0x0f & (int)mdmData[2]);
i[3] = (0x0f & (int)mdmData[3]);
i[4] = (0x0f & (int)mdmData[4]);
i[5] = (0x0f & (int)mdmData[5]);
i[6] = (0x0f & (int)mdmData[6]);
i[7] = (0x0f & (int)mdmData[7]);
i[8] = (0x0f & (int)mdmData[8]);
mtx.Format("%d%d%d%d%d%d kg",i[2],i[3],i[4],i[5],i[6],i[7],i[8]);
strcpy(mdmData,"");
m_teglo = mtx;
UpdateData(false);
CloseHandle(hCom);
CDialog::OnTimer(nIDEvent);
}
Zna4i 4eta tiq danni ot communication porta i tova mi e na timer, timera sum go setnal na 3 sec ( 3000ms ) Zashto ot vreme ne vreme ne pro4ita kakto trqbva dannite i te se razli4avat.

[email protected]
Отговор
в отговор на Mtx_BG #2

Re: VC++ Com port problem

Всеки път отваряш и затваряш порта?

Я вышел им наперерез!
Отговор
в отговор на Mtx_BG #3

Re: VC++ Com port problem

Niakoi zabelejki:
1) Zashto izpolzvash "FILE_FLAG_OVERLAPPED" kato argument na CreateFile!?
Tova obiknoveno predpolage, che sled tova shte polzvash GetOverlappedResult() i OVERLAPPED structurata.
Kato gledam ot source - edvali tova iskash!? Mai shte e po-dobre bez FILE_FLAG_OVERLAPPED flaga.
2) Zashto vikash SetCommMask() !? Tova predpolaga, che sled tova shte polzvash WaitCommEvent(). Moje bi e po-dobre bez SetCommMask()!
-----------------------
Moje bi e po-dobre sled kato otvorish porta - da vikash ClearCommError(). Ot tam shte vidish kolko bytes ima v opashkata i shte gi prochetest s ReadFile().

Отговор
в отговор на Zelenia #4

Re: VC++ Com port problem

S drugi dumi - FILE_FLAG_OVERLAPPED predpolaga asinhronen rejim na rabota s porta - edva li tova iskash.
Po-dobre po po-prostia nachin - bez FILE_FLAG_OVERLAPPED - prosto proveriavash dali ima neshto v opashkata na porta i go prochitash sinhronno s ReadFile().

Отговор