информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаАтака на InternetSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Sophos открывает Sandboxie 
 Большой вторник патчей от MS 
 И ещё раз об интернет-голосовании 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Победил! День победы у меня! 09.05.14 05:55  Число просмотров: 1893
Автор: 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 евента по стопу!

А мне еще с тайм-аутами разбираться...
<programming> Поиск 








Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach