Считывать постоянно с порта данные если они есть и писать их в файл, в любой момент времени пишим в порт и продолжаем считывать новые значения в новый файл. Делал через потоки в Qt драйвер от производителя FTDI (d2xx.dll).
Но тут возникла проблема! Не срабатывает WaitForSingleObject вернее стопорит на нем, хотя данные посылаются (проверял осцилографом). Может у кого такая же проблема возникала, или кто знает как ее решить?
Ниже приведен код потока в котором происходит считывание:
Код
int MyThread::read_ft()
{
int BUF_SIZE = 1;
HANDLE hEvent;
DWORD EventMask;
hEvent = CreateEvent(NULL,false,false,NULL);
EventMask = FT_EVENT_RXCHAR | FT_EVENT_MODEM_STATUS;
ftStatus = FT_SetEventNotification (ftHandle, EventMask, &hEvent);
FT_STATUS ftStatus;
char * pcBufRead;
DWORD dwBytesRead;
DWORD RxByte;
DWORD TxByte;
DWORD Event;
QFile fh;
fh.setFileName(this->fname);
if(!fh.open(QIODevice::WriteOnly))
{
return 10;
}
pcBufRead = (char *)calloc(1,BUF_SIZE);
while(!this->st)
{
WaitForSingleObject (hEvent, INFINITE);
FT_GetStatus(this->ftHandle,&RxByte,&TxByte,&Event);
if(RxByte>0 && TxByte==0)
{
ftStatus=FT_Read(this->ftHandle, pcBufRead, BUF_SIZE, &dwBytesRead);
if(ftStatus != FT_OK)
return 13;
fh.write(pcBufRead,dwBytesRead);
this->bytes+=dwBytesRead;
}
}
fh.close();
return 0;
}
{
int BUF_SIZE = 1;
HANDLE hEvent;
DWORD EventMask;
hEvent = CreateEvent(NULL,false,false,NULL);
EventMask = FT_EVENT_RXCHAR | FT_EVENT_MODEM_STATUS;
ftStatus = FT_SetEventNotification (ftHandle, EventMask, &hEvent);
FT_STATUS ftStatus;
char * pcBufRead;
DWORD dwBytesRead;
DWORD RxByte;
DWORD TxByte;
DWORD Event;
QFile fh;
fh.setFileName(this->fname);
if(!fh.open(QIODevice::WriteOnly))
{
return 10;
}
pcBufRead = (char *)calloc(1,BUF_SIZE);
while(!this->st)
{
WaitForSingleObject (hEvent, INFINITE);
FT_GetStatus(this->ftHandle,&RxByte,&TxByte,&Event);
if(RxByte>0 && TxByte==0)
{
ftStatus=FT_Read(this->ftHandle, pcBufRead, BUF_SIZE, &dwBytesRead);
if(ftStatus != FT_OK)
return 13;
fh.write(pcBufRead,dwBytesRead);
this->bytes+=dwBytesRead;
}
}
fh.close();
return 0;
}