Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение, работая с USB-устр. пропускает данные, Пропуски при запуске других приложений  
:(
    Опции темы
BBulat
Дата 2.9.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



   Мое приложение передает и принимает поток данных от некого 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);
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.