Мое приложение передает и принимает поток данных от некого USB-устройства. Запись и чтение производятся в разных потоках. Данные, принимаемые по USB, записываются в массив типа uint и только после остановки приема и передачи данных содержимое этого массива анализируется на наличие пропусков данных. То есть, приложение непрерывно передает USB-устройству последовательность данных от 1 до 56 по адресам от 0 до 255 соответственно и это же приложение непрерывно считывает те же самые данные, которые USB-устройство отправляет обратно без изменений (тестовый режим работы устройства). Проблема в следующем. Если запустить приложение на машине типа Core2Duo и при этом параллельно не запускать никаких других приложений , то пропусков данных нет. То есть все, что отправил USB-девайсу, все вернулось. Если же запускаю параллельно другие приложения (тестировал с Opera 10, Word 03), то появляются пропуски данных, причем большее их количество приходится на момент запуска и закрытия приложений (Opera, Word). Также подобная проблема возникает при работе на менее мощных ПК типа PIV. Тип конечных точек в USB-устройстве bulk, то есть передача и прием происходят с подтверждением, поэтому тут пропусков быть не должно. Сейчас хотел бы проверить само приложение, может что-то неоптимально написал и пропуски возникают на уровне приложения. Писал в VS 2005, привожу часть кода, отвечающую за прием и передачу данных. | Код | unsigned short int Dch1[5000000]; //массивы для хранения принятых слов unsigned short int Dch2[5000000];
//Поток передачи данных UINT TransmitThread( LPVOID pParam ) { update = 0;
while(update == 0) { int jj = 0; //счетчик байт в пакете //Заполняю буфер для отправки USB-устройству ... Success = WriteFile(PipeOut, &buf_w, 60, &nBytes, NULL);
WR_spd += nBytes; //переменная для измерения скорости передачи данных nBytes=0; }//while(update == 0) return 0; // thread completed successfully AfxEndThread(0, TRUE); }
//Поток, принимающий данные от USB-устройства UINT ReceiveThread( LPVOID pParam ) { stop_r = 0; while(stop_r == 0) { RealRead = 0; ReadFile(PipeIn, &buf_r, 60, &RealRead, NULL); RD_spd += RealRead; RealRead=0; int j=0;
//Запись принятых слов в массив for(int ii=0; ii<12; ii++) { if(buf_r[j]==11) { int xxx = buf_r[j+2]; ... in1_buf[adr] |= xxx; //заполняется массив размером 256 слов для вывода на экран (обновляется через каждые 256 слов) Dch1[i_ch1] = in1_buf[adr]; //заполняется массив для подсчета пропусков i_ch1++;
} if(buf_r[j]==12) { ... аналогично заполняется массив Dch2. }//else
} j += 5; }//for(int i=0; i<12; i++)
}//while(stop_r == 0)
return 0; AfxEndThread(0, TRUE); }
//Start transmit & receive void CTestAPIDlg::OnBnClickedButton1() { update = 1; ... SetTimer( 1, 1000, NULL ); LPVOID pNewObject = "1";
//Запуск потоков AfxBeginThread(ReceiveThread, pNewObject); AfxBeginThread(TransmitThread, pNewObject); }
//Вывод данных по таймеру (1 с) на экран void CTestAPIDlg::OnTimer(UINT nIDEvent) { CString text; for(int i=0; i<256; i++) { text.Format("%d",in1_buf[i]); in1_list.DeleteString(i); in1_list.InsertString(i,text);
text.Format("%d",in2_buf[i]); in2_list.DeleteString(i); in2_list.InsertString(i,text); }//for(int i=0; i<256; i++)
mistake.Format("%d",lost); WR_sp.Format("%d",WR_spd); WR_spd = 0; RD_sp.Format("%d",RD_spd); RD_spd = 0; if(stop_upd == 0)UpdateData(false);
CDialog::OnTimer(nIDEvent); }
|
|