Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 01.08.2014, 14:51  
alik_tv
Частый гость
 
Регистрация: 01.08.2014
Сообщений: 15
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alik_tv на пути к лучшему
По умолчанию USBXpress cp2102

Привет всем

Имеем устройство с мегой, на выходе cp2102 и USB. С виртуальным компортом работает.
Решил пойти "глубже", на USBXpress. Поставил SDK Ver 4.0.2. Почитал описание и примеры в ней.
Написал простейшую программу. Передача запроса в устр-во и получение ответа от уст-ва.

Код:
ret = SI_GetNumDevices(&dwNumDevices);
ret = SI_GetProductString(dwDevice,asDeviceString.c_str(  ),SI_RETURN_DESCRIPTION);
ret = SI_Open(dwDevice,&cyHandle);
ret = SI_SetBaudRate(cyHandle,19200);
ret = SI_SetLineControl(cyHandle,0x0800);
ret = SI_SetFlowControl(cyHandle, SI_STATUS_INPUT, SI_HELD_INACTIVE, SI_HELD_INACTIVE, SI_STATUS_INPUT, SI_STATUS_INPUT, 0);
ret = SI_SetTimeouts(100,INFINITE);   //(DWORD dwReadTimeout,DWORD dwWriteTimeout);

// Запрос
ret = SI_Write(cyHandle,btDataCodogrammaOut,10,&dwBytesWritten);
ret = SI_FlushBuffers(cyHandle,1,0);

// Ответ устр-ва
ret = SI_FlushBuffers(cyHandle,0,1);
ret = SI_Read(cyHandle,btDataCodogrammaIn,9,&dwBytesReturned);

ret = SI_Close(cyHandle);
Результаты работы каждой функции я проверяю.
Запросы передает замечательно, устр-во на запрос отвечает(проверял осциком на TX проца).
Но при выполнении "// Ответ устр-ва" выдается ошибка SI_Read - SI_READ_TIMED_OUT.
Скорость 19200, в датаграмме 10 байт.

Но я не сдался. Я переписал прошивку так, чтобы устр-во каждую секунду передавало мне датаграмму(ту же).
И в этом случае программа читает данные правильно, но только пока не нажать "Запрос", после
первой же передачи функция SI_Read передает SI_READ_TIMED_OUT.

Но я опять не сдался. Я взял программный сниффер "Device Monitoring Studio" и посмотрел что же делает ПО
при попытке чтения. Оказалось, что отправляет посылку Function URB_FUNCTION_CONTROL_TRANSFER
и принимает такую же, но данных там даже близко нет.

В общем грабля. Такое впечатление, что канал работает только в одном направлении.
Что делать?

Олег
Реклама:
alik_tv вне форума  
Непрочитано 01.08.2014, 15:19  
KBH-I
Почётный гражданин KAZUS.RU
 
Аватар для KBH-I
 
Регистрация: 01.05.2009
Адрес: Коптево
Сообщений: 2,849
Сказал спасибо: 276
Сказали Спасибо 427 раз(а) в 274 сообщении(ях)
KBH-I на пути к лучшему
По умолчанию Re: USBXpress cp2102

Переходить на линукс.
Винде капец:
http://nauka21vek.ru/archives/58844
__________________
В рабочее время освоил Альтиум. Глюк оказался в компе...
KBH-I вне форума  
Непрочитано 01.08.2014, 16:37  
RECTO
Супер-модератор
 
Регистрация: 09.06.2011
Сообщений: 2,667
Сказал спасибо: 74
Сказали Спасибо 1,802 раз(а) в 654 сообщении(ях)
RECTO на пути к лучшему
По умолчанию Re: USBXpress cp2102

Сообщение от KBH-I Посмотреть сообщение
Переходить на линукс.
Винде капец
Капец тупым юзерам, которые читают спам и кликают по ссылкам. До сих пор не перестаю удивляться, что еще находятся такие идиоты... Линукс их не спасёт, он тут вообще ни при чём.

Извините, что не по теме...
RECTO вне форума  
Непрочитано 01.08.2014, 19:40  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: USBXpress cp2102

Так напишите по теме? Если знаете в чём причина
niXto вне форума  
Непрочитано 04.08.2014, 18:10  
ksa_kiev
Частый гость
 
Регистрация: 15.01.2005
Сообщений: 32
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
ksa_kiev на пути к лучшему
По умолчанию Re: USBXpress cp2102

Доброго дня!
А зачем Вы чистите буфера каждый раз? Это нужно при открытии хендла и все.
Вам же данные нужны полные. Выгребайте, а там уже ваше дело....
И еще - Вы уверены, что ваш проц что-то успеет выдать до момента чтения?
Посмотрите пример CP210xTestDlg.cpp и an169.pdf.
Что-то мне подсказывает, что DelayMS(60) они не напрасно делали.
При 19200 на 1 байт надо около 0.5 мс.
Применяете OVERLAPPED для обработки чтения и записи.
И обязательно контролируйте результат каждой команды. У Вас в коде этого и близко нет. Или Вы просто костяк дали.
Под Win применять линейный код - не реально.
Кто сказал, что каждая функция блокирующая и будет работать так как Вы этого хотите?

SI_SetTimeouts - по описанию обещает блокировать чтение на 100 ms, т.е. ожидать приема хотя бы чего-то.
А проц успевает отдать данные?
И если таки да, то что-то меня ОЧЕНЬ смущает Ваша постоянная очистка буфера.

По логике:
ret = SI_FlushBuffers(cyHandle,0,1);
ret = SI_Read(cyHandle,btDataCodogrammaIn,9,&dwBytesRetu rned);

Ничего не должно отдать, т.к. если проц успел отдать хотя бы 1 байт (0.5 мс), то ReadTimeout уже истек, а теперь вы очистили буфер приема и сразу читаете чистый буфер (и это время скорее всего менее 0.5 мс), а т.к. ничего нет в буфере - вы и получили ошибку. Просили 9 байт, а вернули вам 0. Тип ошибки - это уже можно додумывать что и как... А что в результатах возврата?
Никогда мне не нравились такие функции чтения.
Ни кто не обещал вам ждать 100 мс. Вам обещали, что 100 мс до прихода чего-то будут ждать.

Попробуйте использовать SI_CheckRxQueue(), как рекомендуют в SI_Read.

и сделать
status = SI_Open(dwDevice, &m_hUSBDevice);
status = SI_FlushBuffers(m_hUSBDevice, TRUE, TRUE);
и после этого забыть про SI_FlushBuffers...

Последний раз редактировалось ksa_kiev; 04.08.2014 в 18:46.
ksa_kiev вне форума  
Непрочитано 05.08.2014, 15:26  
alik_tv
Частый гость
 
Регистрация: 01.08.2014
Сообщений: 15
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alik_tv на пути к лучшему
По умолчанию Re: USBXpress cp2102

Сообщение от ksa_kiev Посмотреть сообщение
Доброго дня!
А зачем Вы чистите буфера каждый раз? Это нужно при открытии хендла и все.
Вам же данные нужны полные. Выгребайте, а там уже ваше дело....
...
и сделать
status = SI_Open(dwDevice, &m_hUSBDevice);
status = SI_FlushBuffers(m_hUSBDevice, TRUE, TRUE);
и после этого забыть про SI_FlushBuffers...
1. Да, я даю без обработчиков ошибок, чтобы не перегружать текст.
2. FlushBuffers не просто чистит буфер, но еще и принудительно передает данные буфера получателю данных. Насколько я понимаю.
3. Если я не вставлю SI_FlushBuffers после передачи, то успешно пройдет только первая передача, при попытке повтора получу SI_DEVICE_IO_FAILED.
Не знаю почему так.
4. SI_FlushBuffers перед приемом я поставил по аналогии с передачей. Но с ним и без него одна и та же ошибка - SI_READ_TIMED_OUT.
5. Так я делал, все также.
status = SI_Open(dwDevice, &m_hUSBDevice);
status = SI_FlushBuffers(m_hUSBDevice, TRUE, TRUE);

На остальные замечания отвечу позже, нужно время для проверки.
alik_tv вне форума  
Непрочитано 05.08.2014, 16:03  
alik_tv
Частый гость
 
Регистрация: 01.08.2014
Сообщений: 15
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alik_tv на пути к лучшему
По умолчанию Re: USBXpress cp2102

Сообщение от ksa_kiev Посмотреть сообщение

И еще - Вы уверены, что ваш проц что-то успеет выдать до момента чтения?
Посмотрите пример CP210xTestDlg.cpp и an169.pdf.
Что-то мне подсказывает, что DelayMS(60) они не напрасно делали.
При 19200 на 1 байт надо около 0.5 мс.
Применяете OVERLAPPED для обработки чтения и записи.
Кто сказал, что каждая функция блокирующая и будет работать так как Вы этого хотите?

SI_SetTimeouts - по описанию обещает блокировать чтение на 100 ms, т.е. ожидать приема хотя бы чего-то.
А проц успевает отдать данные?
И если таки да, то что-то меня ОЧЕНЬ смущает Ваша постоянная очистка буфера.

По логике:
ret = SI_FlushBuffers(cyHandle,0,1);
ret = SI_Read(cyHandle,btDataCodogrammaIn,9,&dwBytesRetu rned);

Ничего не должно отдать, т.к. если проц успел отдать хотя бы 1 байт (0.5 мс), то ReadTimeout уже истек, а теперь вы очистили буфер приема и сразу читаете чистый буфер (и это время скорее всего менее 0.5 мс), а т.к. ничего нет в буфере - вы и получили ошибку. Просили 9 байт, а вернули вам 0. Тип ошибки - это уже можно додумывать что и как... А что в результатах возврата?
Никогда мне не нравились такие функции чтения.
Ни кто не обещал вам ждать 100 мс. Вам обещали, что 100 мс до прихода чего-то будут ждать.
1. У моего уст-ва максимальная задержка 5мс, на выдачу. 9байт это еще около 5мс. потому 100 мс это с большим запасом. Я ставил и 1с, голый номер.
2. То что функции и чтения и записи блокирующие я проверял.
Ставил SI_SetTimeouts 1с таймаут и проверял. Все замечательно блокируется.
3. Я пытался чтение производить из отдельного потока, но последние версии
SDK не поддерживают многопоточности. По крайней мере такую инфу я нашел на одном из форуме, вроде даже силабовском, точно не помню.
Кстати с какой версией SDK Вы работали?
4. Насколько я понял описание, таймаут до возврата стольких байт сколько задано прочитать в SI_Read.
alik_tv вне форума  
Непрочитано 05.08.2014, 16:28  
alik_tv
Частый гость
 
Регистрация: 01.08.2014
Сообщений: 15
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alik_tv на пути к лучшему
По умолчанию Re: USBXpress cp2102

Сообщение от ksa_kiev Посмотреть сообщение
Попробуйте использовать SI_CheckRxQueue(), как рекомендуют в SI_Read.
написал так (как образец взял TestPanelModule.bas)

Код:
ret = SI_CheckRXQueue(cyHandle,&dwNumBytesInQueue,&dwQueueStatus);

while ((ret == SI_SUCCESS)&&(dwQueueStatus != SI_RX_READY))
     {
    ret = SI_CheckRXQueue(cyHandle,&dwNumBytesInQueue,&dwQueueStatus);
     }

ret = SI_Read(cyHandle,btDataCodogrammaIn,9,&dwBytesReturned);//,NULL);
В цикле замечательно виснет, как и должно быть. 0)
alik_tv вне форума  
Непрочитано 05.08.2014, 18:42  
alik_tv
Частый гость
 
Регистрация: 01.08.2014
Сообщений: 15
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alik_tv на пути к лучшему
По умолчанию Re: USBXpress cp2102

Попробовал с SDK ver. 3.5.1
Без SI_FlushBuffers после SI_Write, запись работает только раз.
Во второй возвращает SI_SYSTEM_ERROR_CODE.
И похоже вешает драйвер т.к. нужно перетыкать уст-во.

SI_Read: и с SI_FlushBuffers и без - SI_READ_TIMED_OUT

Интересно, что в многопоточном режиме эта версия действительно работает,
по крайней мере не выдает ошибку SI_INVALID_HANDLE как 4.0.
alik_tv вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CP2102 переконфигурирование Андрей К Микроконтроллеры, АЦП, память и т.д 2 10.01.2014 09:52
Отладочная плата с CP2102 = Microsoft trackball DK Коллекция глюков 5 12.05.2012 19:58
CP2102 - кто то с ней работал? dimonbest Микроконтроллеры, АЦП, память и т.д 4 07.11.2008 19:43
Заработает ли USB на CP2102 + флэшка? svad0 Микроконтроллеры, АЦП, память и т.д 2 22.01.2008 14:37


Часовой пояс GMT +4, время: 05:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot