Easyelectronics.ru

Электроника для всех
Текущее время: 27 сен 2020, 02:35

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Qt+FT232RL
СообщениеДобавлено: 28 авг 2011, 22:23 
Заглядывает иногда

Зарегистрирован: 24 июл 2010, 21:53
Сообщения: 76
Доброго всем времени суток.
Если создал тему не в том разделе пусть модераторы перенесут туда куда надо.
Задача: есть мк который шлёт со скоростью 1,5 Мбит/с 40 байт берез каждые 30 мкс,
надо написать прогу на Qt которая бы принимала ВСЕ байты. Что сделал: написал прогу на
Qt в котором чтение байтов в происхоит в отдельном потоке. Создаётся также объект-событие
которое запускает поток когда в буфер FT232RL приходит хотя бы один байт. Дальше поток запускается узнаём сколько байт пришло в буфер FT232RL запускается функция чтения байтов.
Когда кол-во байтов меньше 256 то чтение происходит отлично. Когда мк который шлёт со скоростью 1,5 Мбит/с 40 байт берез каждые 30 мкс, то во время выполнения проги сразу вылетает ошибка и приложение закрывается. Код потока:
Код:
void Receive_Thread::run()
{
    hEvent = CreateEvent(NULL, false, false, NULL);      //создаём событие стандартная функция винды
    EventMask = FT_EVENT_RXCHAR;                         //задаём маску событий когда поступил байт
    ftStatus = FT_SetEventNotification(ftHandle, EventMask, hEvent);          //устанавливаем собственно событие
    while(my_thread.isRunning())
    {
        WaitForSingleObject(hEvent, INFINITE);
        FT_GetStatus(ftHandle, &RxBytes, &TxBytes, &EventDWord);
        if (EventDWord & FT_EVENT_RXCHAR)
        {
            // call FT_Read() to get received data from device
            ftStatus = FT_Read(ftHandle, RxBuffer, RxBytes, &BytesReceived);
            if (ftStatus == FT_OK)
            {
                // FT_Read OK
                sendSignal();
            }
            else
            {
                // FT_Read Failed
            }
            EventDWord=0;
        }
    }//end while(my_thread.isRunning())
}
[code]
Вопрос: как сделать так чтоб

Собственно вопрос: как сделать так чтоб можно было прочесть 40 байт берез каждые 30 мкс
и не потерять байты и программа не завершала свою работу с ошибкой?
Должен же быть какой-то метод сделать это, ведь FT232RL может передавать данные со скоростью 3 Мбит/с.
Всем спасибо за внимание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 11:33 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Вы вряд ли сможете это реализовать, задержки шины USB никто не отменял и вы просто получите буферизирование байт внутри микрухи и потом групповую отправку в компьютер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 16:19 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1157
Откуда: Default city
Делал. Получается. Буфер FT поможет. Только ft2232h. С этими устаревшими чипами врядли получится.
>стандартная функция винды
Так с QT делать нельзя. Есть замечательная библиотека (что бы не говорили некоторые в нашей лабе) QSerialSevice. Посмотри.

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 16:44 
Заглядывает иногда

Зарегистрирован: 24 июл 2010, 21:53
Сообщения: 76
dekar а можно пожалуйста по подробнее описать как ты делал. Оч надо.
И почему так: hEvent = CreateEvent(NULL, false, false, NULL); в Qt делать нельзя?
И дело в том что я ft2232h не поставлю. Платы уже готовые, надо только прошивку под мк написать, и прогу для компа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 18:23 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
>>Собственно вопрос: как сделать так чтоб можно было прочесть 40 байт берез каждые 30 мкс

Попробуйте передавать данные пакетами кратными 64 байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 19:04 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1157
Откуда: Default city
MCDFV писал(а):
dekar а можно пожалуйста по подробнее описать как ты делал. Оч надо.

Давайте подумаем. Буфер для записи у этой схемы жалкие 128 бит.
Заполняется он раз в 3 записи, следовательно читаться должен раз в 100мкс.
Изохронный режим опрашивается не реже, чем раз в 250мкс => задача не выполнима. Однако, надо проверить, как часто у Вас опрашивается изохронный УСБ канал. У меня, по тестам, в среднем получалось около 70-100мкс, чего для вашей задачи хватает. Разве что, иногда пропадёт пара пакетиков.
MCDFV писал(а):
И почему так: hEvent = CreateEvent(NULL, false, false, NULL); в Qt делать нельзя?

Qt - кроссплатформенная библиотека, и использовать платформозависимые решения - терять переносимость. К тому же, можно легко без них обойтись.
MCDFV писал(а):
И дело в том что я ft2232h не поставлю. Платы уже готовые, надо только прошивку под мк написать, и прогу для компа.

А вот это уже плохо. Может тогда пакеты можно сократить. Например, слать только если что-то поменялось, или сжатие какое-либо специфичное под данные придумать...
Upd. Если сделать данные по 16 бит - всё гарантированно поместится.

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 19:26 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5893
Откуда: Москва/Саратов
Цитата:
Давайте подумаем. Буфер для записи у этой схемы жалкие 128 бит.
256, не?

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 19:45 
Заглядывает иногда

Зарегистрирован: 24 июл 2010, 21:53
Сообщения: 76
Мне главное передавать из мк в комп быстро и НИЧЕГО не должно потеряться. Если будет теряться то дальше делать не стоит. В проге есть кольцевой буфер, оттуда берутся данные подготавливаются на отправку и отправляются. Длина каждого пакета 40 байт и передающий буфер ФТ232РЛ 256 БАЙТ, а команды от компа в мк будут приходит не быстрее чем пользователь будет успевать нажимать на клавишу отправки команды например. Так что с передачей пакета из компа в мк проблем нет вообще. Пакеты нельзя сократить и нельзя сжать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 20:00 
Заглядывает иногда

Зарегистрирован: 24 июл 2010, 21:53
Сообщения: 76
Цитата:
Однако, надо проверить, как часто у Вас опрашивается изохронный УСБ канал. У меня, по тестам, в среднем получалось около 70-100мкс, чего для вашей задачи хватает.

А как это проверить? И как это можно настроить если можно? (мож последний вопрос и тупой но я оч поверхностно понимаю работу ЮЗБ интерфейса).
Ведь софт же должен работать на любом компе (ну компы на основе х386 и пня первого я во внимание не принимаю).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 20:22 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
>>А как это проверить? И как это можно настроить если можно?

USB - пакетный интерфейс, частота транзакций для Full speed - 1кГц (раз в 1мс передается стартовый пакет и происходит новая транзакция). Макс. размер bulk пакета - 64 байта http://www.beyondlogic.org/usbnutshell/usb4.shtml#Bulk . Плюс FT232 сначала накапливает данные в приемном буфере и передает по USB после его заполнения или истечения заданного тайм-аута (2..255мс, задается функцией FT_SetLatencyTimer). По умолчанию таймер установлен аж на 16мс, может поэтому обмен тормозит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 20:31 
Старожил

Зарегистрирован: 12 апр 2011, 01:45
Сообщения: 852
Откуда: Россия
хм, вообще изохорный режим, судя по стандарту, доставки не гарантирует.... т.е. вам еще придется делать проверку полученных данных (ну в теории)
далее - что за ошибка то? может от этого плясать? - воткните обработку ошибок с выводом параметров... может вы пытаетесь читать больше чем надо? или может драйвера сбоят?

Далее
FT_GetStatus(ftHandle, &RxBytes, &TxBytes, &EventDWord);
не проверяете что возвращает функция, может там ошибка?
не вижу где получается ftHandle

Вы каждый раз поток при чтении создаете? а прибивать не забываете? В винде есть ограничение у процесса на число потоков.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 20:39 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
>>Изохронный режим опрашивается не реже, чем раз в 250мкс => задача не выполнима

Откуда у FT232 изохронный режим ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 29 авг 2011, 22:31 
Заглядывает иногда

Зарегистрирован: 24 июл 2010, 21:53
Сообщения: 76
Всё по порядку.
По поводу ошибки после завершения приложения показывается код ошибки, наверное цифр 10 а мож и больше. И мне от этого не легче, я пытался искать ошибку по этим цифрам и безуспешно.
reptile установлю завтра тайм аут на 2 мс, посмотрим что будет.
Wraith да ты прав корректность выполнения этой: FT_GetStatus(ftHandle, &RxBytes, &TxBytes, &EventDWord); функции не проверяется. Допишу.
Поток я создаю один раз, и из кода потока видно что есть цикл который выполняется пока поток запущен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 02:09 
Старожил

Зарегистрирован: 12 апр 2011, 01:45
Сообщения: 852
Откуда: Россия
Access Violation я подозреваю? Сишное сообщение или стандартное виндовое?
Далее, вы пишите про получение 256 байт - наводит на мысли что где-то попутали указатель.... Я бы на вашем месте обернул каждый шаг в конструкции вида try except (простите это делфи, на сях я не так давно пишу, не знаю как там эта конструкция делается) и внутри по коду ошибки получил бы её текст и обязательно параметры которые передаете.

Виндовс имеет несколько вложенных обработчиков ошибок - 1 - в приложении 2 - тоже в приложении, но этот обработчик пихает компилятор (всегда и на всех языках) и т.д.
т.к. у вас обработки ошибок нет, логично предположить, что падает на внешнем обработчике ошибки, которую вставил компиль.

Может вы читать мимо буфера пытаетесь, или размер буфера мал? - читаю описание FT_Read
FT_STATUS FT_Read (FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpdwBytesReturned)
В качестве буфера (если я ничего не напутал) должен быть указатель.
QT дает запускать приложение в режиме дебага? что-бы в самой среде при возникновении ошибки смотреть куда полезла программа в какой участок памяти? Как вариант не исключена вероятность ошибки в драйвере....

пример кода на делфях - может будет проще понять что я тут накорябал :)
Код:
try
.....
код
.....
except
  on E : EOleException do
    Begin
      messagebox(mform.Handle,Pchar(Format('Errcode=%s. %s',[IntToStr(E.ErrorCode),E.Message])),'Ошибка',mb_ok+MB_ICONERROR);
    end;
end;

EOleException - это для отлова ошибки OLE объекта. (это я с Экселем работал) - вам надо свое

Я это все к чему(просто может показаться бредом :)) ), раз уж вы кроме кода ничего менять не можете, надо писать его максимально защищено, и на стадии отладки с возможностью понять в любой момент времени что произошло. Потом просто все или подчистите, или используете ключи компиляции типа {$IFDEF DEBUG}... {$ENDIF} (опять же делфа), с учетом которых компилятор при переводе проекта из типа debug в тип release сам выкинет отладочный код...

Пойду еще почитаю...

почитал - вы из мануала код взяли?.... char RxBuffer[256]; - не? не оно?
еще почитал LPVOID - Указатель на любой тип. Этот тип объявлен в Windef.h как показано ниже: typedef void *LPVOID;

Судя по всему, если вы не напортачили с размером буфера, в мануале в коде ошибка....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 03:15 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
а почему нельзя просто открывать ком-порт и читать оттуда? у винды под ком-порты есть еще и свой буффер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 03:34 
Старожил

Зарегистрирован: 12 апр 2011, 01:45
Сообщения: 852
Откуда: Россия
компорт скорость 1,5Мбита не даст..... надо делать буфер на схеме, а схему уже не переделать, да и наверное данные критичны ко времени...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 08:50 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Wraith писал(а):
компорт скорость 1,5Мбита не даст..... надо делать буфер на схеме, а схему уже не переделать, да и наверное данные критичны ко времени...

А нужны ли они реально, эти 1,5Мбита, для пакетов по 40 байт? Как часто будут идти эти пакеты? Может, всего - то 10-20 раз в секунду... Действительно ли надо их слать через 30 мкс, или это "на всякий случай"? И насколько критична их задержка?

Ох уж эта детская тяга к максимализму, без учета реальных данных...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 10:40 
Заглядывает иногда

Зарегистрирован: 24 июл 2010, 21:53
Сообщения: 76
SWG делаю девайс мониторинг CAN шины на скорости 1Mbit. Ну точно не 10-20 раз в секунду надо данные передавать.
В си++ если параметром функции является буфер то в фактических параметрах можно указать не указатель на первый элемент а его имя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 10:45 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
Wraith, а сколько ком-порт даст?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 11:15 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1157
Откуда: Default city
1) Да, ошибся. Там bluk.
2) Когда я говорил про буфер, я имел ввиду буфер на передачу с девайса (TX буфер). Прошу прощения, что запутался.
3) Реальной разницы по чтению из ком порта и через апи драйвера нет. Посему советую читать с ком порта - проще. И, да, на скорости 4М я его поднимал с той библиотеки, на которую ссылался.
4) Всё равно, ограничения с частотой опроса будут, с этим ничего не поделаешь. Аесли гарантия для Full speed - 1мс, то тогда максимальная скорость обмена данными - 256 байт в мс - 256кбай/сек. И никак быстрее не получишь.

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 14:15 
Старожил

Зарегистрирован: 12 апр 2011, 01:45
Сообщения: 852
Откуда: Россия
Ink писал(а):
а сколько ком-порт даст?

Согласно стандарта предел 256КБит/сек ~ 32кБайта/секунду, но это на проводе длиной менее 1,5метров, на проводе 1,5метра выше 115кБод надежно получить малореально. но это оригинальный RS232, что там с эмуляцией через USB, я хз если честно... (да, чуток запарил :) ) Ну вон dekar говорит что поднимал, значит в принципе возможно..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 16:44 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
>>Аесли гарантия для Full speed - 1мс, то тогда максимальная скорость обмена данными - 256 байт в мс - 256кбай/сек. И никак быстрее не получишь.

для PL2303 обещают даже 6Мбит, но я сомневаюсь что через USB1.1 можно прокачать непрерывный поток 6Мбит, скорее это возможно для небольших пакетов и только в одну сторону


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 21:09 
Заглядывает иногда

Зарегистрирован: 24 июл 2010, 21:53
Сообщения: 76
Путём тщательной оптимизаци и упаковки пакетов, пришёл к такой идее: буду заполнять буфер
FT232 почти полностью, затем буду изменять состоянии линии CTS которая будет запускать поток и считывать данные из микросхемы. В итоге должно получится как писал dekar,
256кбай/сек или если умножить на 8 то 2048 кбит/с что приблизительно будет соответствовать скорости 2 Мбит/с.
Пока прогу в Qt оставил. Надо переделывать прогу мк.
И ещё Wraith писал(а) про то шо я попутал указатель. Я вот анализирую то что я писал и никак не погу понять почему были сделаны такие выводы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 23:42 
Заглядывает иногда

Зарегистрирован: 10 фев 2010, 00:33
Сообщения: 198
Откуда: Нижний Новгород
dekar писал(а):
Делал. Получается. Буфер FT поможет. Только ft2232h. С этими устаревшими чипами врядли получится.
>стандартная функция винды
Так с QT делать нельзя. Есть замечательная библиотека (что бы не говорили некоторые в нашей лабе) QSerialSevice. Посмотри.


Примерчик бы кинул. Как с ней работать.

_________________
http://chyvack.ru/ Умные используют компьютер для экономии времени, дураки - чтобы его потратить...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Qt+FT232RL
СообщениеДобавлено: 30 авг 2011, 23:44 
Старожил

Зарегистрирован: 12 апр 2011, 01:45
Сообщения: 852
Откуда: Россия
про указатель - это было предположение, просто ошибки доступа чаще всего от этого...
Во 2х вы сказали что до 256байт все передается ок, а это говорит что код более или менее рабочий...
Я так понял из слов dekar, что никакого буфера особо не нужно... просто выставляете скорость компорта на 2Мбита и работаете с ним... хотя с буфером будет проще - не такие большие требования к скорости...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB