реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Ввод данных в компьютер., Бинарный поток.
SNR
сообщение Aug 9 2012, 06:37
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Спасибо за ответы. Поток от устройства (спутниковый модем) идет непрерывно. Моя программа просто должна записывать его на компьютер.

Про отдельный поток, спасибо, попробую, хорошая идея.
А вот
<<Записывать данные в файл нужно только тогда, когда чтение данных через USB было завершено успешно.
как это реализовать?
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Aug 9 2012, 10:34
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(SNR @ Aug 9 2012, 09:37) *
...А вот
<<Записывать данные в файл нужно только тогда, когда чтение данных через USB было завершено успешно.
как это реализовать?

Раздел "12.22 XferData( )" файла "CyAPI.pdf" (страница 67):
Цитата
XferData performs synchronous (i.e. blocking) IO operations. It does not return until the transaction
completes or the endpoint's TimeOut has elapsed.
Returns true if the transaction successfully completes before TimeOut has elapsed.
Note that the len parameter is a reference, meaning that the method can modify its value. The number of
bytes actually transferred is passed back in len.

То есть, еще нужно анализировать какое количество байт возвращает XferData():
Код
  
      while (iStart)
      {
           LONG bytes_readed = len;
      
           if(USBDevice->BulkInEndPt->XferData(InBuf,bytes_readed))
               FileWrite(FileHandle, InBuf, bytes_readed);
            
           Application->ProcessMessages();
      }
Go to the top of the page
 
+Quote Post
SNR
сообщение Aug 10 2012, 10:06
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Сделал в отдельном потоке, считываю по вишеописаному коду.
Скорость входных данных 1300 КБайт/сек - проверил прогой Streamer.

Пишу в файл тестовые кадры с периодом 8192 бита, потом просматриваю бинарным просмотрщиком.
Иногда наблюдаются розрывы потока (См. рис). Как с этим бороться? скорость то потока совсем небольшая и уже разрывы.

Увеличивать буферы?

сейчас стоит
USBDevice->BulkInEndPt->SetXferSize(1000000);
USBDevice->BulkInEndPt->TimeOut=1000;

Спасибо!

Сообщение отредактировал SNR - Aug 10 2012, 10:40
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Aug 10 2012, 13:11
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(SNR @ Aug 10 2012, 13:06) *
...Иногда наблюдаются розрывы потока (См. рис). Как с этим бороться?...Увеличивать буферы?...

Так и должно быть, поскольку Вы используете блокирующее чтение данных через USB. При этом, увеличение размера буфера драйвера свыше числа байт, которое считывается функцией XferData() бесполезно. Можно попытаться назначить потоку отдельный процессор (ядро процессора). Но, правильный подход - использовать не блокирующее чтение (overlapped).

Давайте вспомним, что обмен через USB всегда инициируется хост-контроллером ПЭВМ. То есть, устройство USB не сможет передать данные ПЭВМ, пока хост-контроллер не запросит эти данные. Рассмотрим, что происходит при выполнении следующего кода в отдельном потоке, назовем его readUSB_thread:
Код
while (iStart)
{
  LONG bytes_readed = len;

  if(USBDevice->BulkInEndPt->XferData(InBuf,bytes_readed))
    FileWrite(FileHandle, InBuf, bytes_readed);
}

XferData() выдает запрос драйверу CyUsb.sys на чтение len байт. Пока драйвер считывает блок данных через USB разрывов чтения быть не может (не должно rolleyes.gif). Но даже во время чтения блока данных поток readUSB_thread может быть приостановлен (вытеснен другим потоком) на время не менее 10 мс (поправьте меня если я не прав). Если выполнение потока readUSB_thread будет возобновлено до завершения чтения блока данных драйвером, то этот поток вообще не почувствует, что его выполнение прерывалось.
После чтения блока данных выполняется запись этих данных на диск. Если время записи данных на диск не превысит времени заполнения FIFO контроллера FX2LP, то потери данных не будет. Но, важно другое. После завершения чтения блока данных через USB может произойти переключение потоков. Остановка потока readUSB_thread даже на 10 мс приведет к переполнению буфера FIFO FX2LP. Вспомним, что для bulk пересылок объем буфера FIFO не превышает 2 Кбайт, то есть для Вашего потока данных FIFO будет переполнено через 1.6 мс.
Можно попытаться назначить отдельный процессор для выполнения потока readUSB_thread. Но, Windows может запустить дополнительные потоки и в том процессоре.

При использовании не блокирующего чтения можно до выполнения цикла выдать драйверу два запроса на чтение данных. А в самом цикле, после получения очередного блока данных выдавать драйверу следующий запрос. В этом случае уже можно и нужно правильно подобрать размер буфера драйвера (я бы задал 32 Мбайта) и размер блока данных для каждого считывания (по 16 Мбайт). При таких условиях переключение потоков уже не должно приводить к потере данных.
Go to the top of the page
 
+Quote Post
SNR
сообщение Aug 12 2012, 20:33
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Большое спасибо Вам Konst_777 за разьяснение. Для меня, как для не программиста, многое прояснилось. А вот по поводу реализации алгоритма из последнего абзаца, то буду думать и возможно периодически задавать "глупые вопросы", так как быстро написать у меня не получится - мало опыта в этой области.

Спасибо!
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Aug 13 2012, 15:08
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(SNR @ Aug 12 2012, 23:33) *
...А вот по поводу реализации алгоритма из последнего абзаца...

Посмотрите в "CyAPI.pdf" описание и примеры к функциям "12.4 BeginDataXfer()", "12.21 WaitForXfer()", "12.12 FinishDataXfer()".

То что Вы делаете, Вы собираетесь использовать "для дома, для семьи" в одном экземпляре или планируете изготавливать для продажи? Если для продажи, то присоединяюсь к совету уважаемого iosifk - Вам нужно использовать Ethernet и TCP/IP. Также, Ваш модуль должен иметь ОЗУ достаточного объема (буферизировать хотя бы 3-4 секунды потока данных). Посмотрите на сайте otladka.com.ua модули SK-STM32F417 и SK-STM32F217.

Go to the top of the page
 
+Quote Post
SNR
сообщение Aug 13 2012, 16:54
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Буду разбираться с этими функциями. Нет это хобби, как продолжение темы:
http://electronix.ru/forum/index.php?showt...t=0&start=0
Купил себе на ебее неисправный спутниковый модем SLM-7650, отремонтировал его и планирую применять
для приема спутников ДЗЗ в L- диапазоне.Так вот этот модем имеет последовательный выход данных (DATA и CLK) с максимальной CLK в 20 МГц. Я уже написал на Плис преобразователь из последовательного в параллельный 16 -битный с защелкой данных по положительному фронту сигнала SLWR. Теперь вот дошла очередь до USB и программы для записи.

73!
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Aug 13 2012, 19:56
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(SNR @ Aug 13 2012, 19:54) *
...Нет это хобби...

В таком случае можно попытаться использовать USB. А можете выложить принципиальную схему модуля "CY7C68013A + FPGA Altera Max 2 EPM240T100C5" и ссылку на него на eBay?

73!
Go to the top of the page
 
+Quote Post
SNR
сообщение Aug 13 2012, 21:04
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Наборы от китайцев с ебея где-то в дороге едут. Брал это:
http://www.ebay.com/itm/EPM240-Altera-MAX-...d#ht_857wt_1163

http://www.ebay.com/itm/EZ-USB-FX2LP-CY7C6...#ht_4637wt_1397

Пока они едут, я тренируюсь на CY7С68013A+EP1C6T144. Запись в СY7С делаю положительным фронтом SLWR.

Набросал быстро схему.

Завтра попробую что-то сваять в программе с использованием overlap.

73!

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Aug 14 2012, 05:57
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(SNR @ Aug 14 2012, 00:04) *
...Пока они едут, я тренируюсь на CY7С68013A+EP1C6T144...

А это тоже два отдельных модуля? Можете выложить принципиальные схемы модулей и ссылку на продавца?

Полагаю, что Вы знаете, как избежать воздействия шумов цифровых устройств на приемник спутникового модема. Поэтому не задаю вопрос, как же Вы это сделаете sm.gif
Go to the top of the page
 
+Quote Post
SNR
сообщение Aug 14 2012, 07:29
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Полной схемы на CY7С68013A+EP1C6T144 к сожалению нет. Это я на работе, в старых загашниках нашел эту плату, когда-то кто-то на ней что-то лепил. Та блок схема что выше - я по распиновке восстановил.

Набросал код для приема с использованием Overlap:

//-----------------Поток для записи данных на диск --------------------------

void __fastcall TWriteThread::Execute()
{

OVERLAPPED inOvLap;
inOvLap.hEvent = CreateEvent(NULL, false, false,"CYUSB_IN");

char inBuf[512];
ZeroMemory(inBuf, 512);
ULONG length = 512;

while (!Terminated) //основной цикл чтения данных из USB
{

UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap);

USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);

USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);

// CloseHandle(inOvLap.hEvent);

FileWrite(FileHandle, inBuf, length); //пишем у файл данные

count=count+length; //увеличиваем счетчик принятых байт.
}

}

Результат пока тот же, поток рвется, даже на маленькой скорости( подавал на вход СLK и DATA со скоростью 9,8МГц, то есть на выходе 16 -битные данные будут защелкиваться с частотой 9,8/16 = 612,5 кГц).


73!

Сообщение отредактировал SNR - Aug 14 2012, 07:33
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Aug 14 2012, 07:53
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(SNR @ Aug 14 2012, 10:29) *
Полной схемы на CY7С68013A+EP1C6T144 к сожалению нет. Это я на работе, в старых загашниках нашел эту плату, когда-то кто-то на ней что-то лепил. Та блок схема что выше - я по распиновке восстановил...

То есть, все таки CY7С68013A+EP1C6T144 на одном модуле. Тогда зачем Вам зоопарк из двух модулей? Используйте этот модуль. EP1C6 можно загрузить по JTAG через FX2LP (CY7С68013A).

Цитата(SNR @ Aug 14 2012, 10:29) *
Набросал код для приема с использованием Overlap:...

Выложите исходники программы (проект). Я внесу изменения.
Go to the top of the page
 
+Quote Post
SNR
сообщение Aug 14 2012, 08:31
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Вот весь проект:


Прикрепленные файлы
Прикрепленный файл  Binreader.rar ( 420.18 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Aug 15 2012, 05:45
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(SNR @ Aug 14 2012, 11:31) *
Вот весь проект:

Вчера увлекся переделкой Вашего проекта. В результате программа вообще перестала работать rolleyes.gif
В проекте, который выкладываю, сделаны минимальные изменения. Давайте вначале проверим, есть ли потери данных при приеме. А уже потом будем добиваться восстановления работоспособности при сбоях обмена через USB.
Прикрепленные файлы
Прикрепленный файл  Binreader.7z ( 346.92 килобайт ) Кол-во скачиваний: 23
 
Go to the top of the page
 
+Quote Post
SNR
сообщение Aug 15 2012, 08:13
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 17-05-09
Из: Kiev
Пользователь №: 49 171



Итак, результаты тестов на ноутбуке на работе: антивирус отсутствует, хост:
(Intel® 5 Series/3400 Series Chipset Family USB Enhanced Host Controller)

Непрерывно подается тестовый кадр с периодом 8192 и синхромаркером вначале.

Тест1:
Частота CLK=12.25МГц, скорость поступления данных в 68013A равна ~900 KB/sec, длительность записи 15 мин (обычное время радиовидимости спутника). В записаном файле разрывов не обнаружено.
Тест2:
Частота CLK=24.5МГц, скорость поступления данных в 68013A равна ~1300 KB/sec, длительность записи 15 мин (обычное время радиовидимости спутника). В записаном файле разрывов не обнаружено.

Пока вродь нормально, вечером на домашнем еще попробую.

73!
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 20:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01955 секунд с 7
ELECTRONIX ©2004-2016