Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Победил! День победы у меня! 09.05.14 05:55 Число просмотров: 4999
Автор: Zef <Alloo Zef> Статус: Elderman
|
Через вот такую задницу:
DCB dcbSerialParams = {0};
char Code[20], Code2[20];
HANDLE hSerial, hEvent[2];
OVERLAPPED m_OvrLapped;
DWORD dwEvent = EV_RXCHAR;
unsigned long wait = 0, state = 0;
hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,
FILE_FLAG_OVERLAPPED||FILE_FLAG_NO_BUFFERING,0);
if(hSerial==INVALID_HANDLE_VALUE)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
return 1;
}
else
{
return 2;
}
}
if (!GetCommState(hSerial, &dcbSerialParams))
{
return 3;
}
dcbSerialParams.BaudRate=CBR_115200;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams))
{
return 4;
}
if(!SetCommMask(hSerial,EV_RXCHAR)) {return 4;}
return 0;
void CBarcodeDlg::OnAutoBtn()
{
if ((endNum >= startNum)&&!FromFile){return;}
::EnableWindow(hAutoBtn, false);
hEvent[0] = ::CreateEvent(NULL, true, false, NULL);
hEvent[1] = ::CreateEvent(NULL, false, false, NULL);
m_OvrLapped.hEvent = hEvent[1];
m_OvrLapped.Offset = 0;
m_OvrLapped.OffsetHigh = 0;
_beginthread( Thread, 0, NULL );
}
void Thread( void* pParams )
{
while(true)
{
//Готовим содержимое массива Data
BOOL iRet = WriteFile (hSerial,&ENK,1,&iSize,&m_OvrLapped);
WaitForSingleObject(hEvent[1],INFINITE);
WaitCommEvent(hSerial, &state, &m_OvrLapped);
dwEvent = WaitForMultipleObjects(2, hEvent, false, INFINITE);
if(dwEvent == WAIT_OBJECT_0){return 1;}
ReadFile(hSerial, (char*)&sReceived, 1, &iSize, &m_OvrLapped);
WaitForSingleObject(hEvent[1],INFINITE);
if (iSize == 0|sReceived != 0x06) {goto err;}
}
err:CancelIo(hSerial);
_endthread();
}
void CBarcodeDlg::OnStopBtn()
{
SetEvent(hEvent[0]);
this->GetDlgItem(IDC_BUTTON4)->EnableWindow(false);
}
Не... Если я поймаю Гейтса, я его сначала изнасилую, потом - убью, потом опять изнасилую в особо извращенной форме! Это же надо - такую ж... сотворить. Синхронный вариант написал за день, об асинхронны - 3ю неделю долблюсь. Причем, что делать надо так, а не иначе, ни в каком мануале не написано. Хорошо - сэмпл в Сети нашел. И то дальше сам на кофейной гуще экспериментировал:
В реале у меня 3 Райта и 6 ридов в цикле. Можно ли WaitCommEvent 1 раз воткнуть "за все"? Экспериментально установил, что - нет, на каждый Рид - по новой. А в какой место WaitForMultipleObjects совать, чтобы прервать зависший ввод? И наконец - десерт: казалось бы логичный здесь FILE_FLAG_NO_BUFFERING почесу-то блокирует прием WaitForMultipleObjects евента по стопу!
А мне еще с тайм-аутами разбираться...
|
|
|