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

 
 
 
Reply to this topicStart new topic
> Пример AT91SAM7S64-BasicUSART_USB для IAR, Проблема с передачей бинарного потока по USB
VYK
сообщение Mar 10 2007, 18:49
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 13-11-06
Пользователь №: 22 252



Уважаемые господа!
Пытаюсь разобраться с USB для AT91SAM7S64. Для изучения использую пример AT91SAM7S64-BasicUSART_USB для IAR.
При передаче ASCII-кодов с помощью терминальной программы в устройство оно, соответственно, передаёт их обратно в компьютер, как и должно быть, без искажений. Как только я попытался с помощью собственной коммуникационной компьютерной программы передать в устройство / принять из устройства бинарный поток (0х00...0хFF), то обнаружил следующую проблему. С помощью функции Read бинарный поток принимается без искажений, а вот передача из устройства в компьютер с помощью функции Write происходит с искажениями: как только в потоке встречается байт 0х00, то все следующие за ним байты начинают передаваться как 0xCD. Что это может быть? Сталкивался ли кто-нибудь с этим?
Заранее благодарю за помощь и совет.
Go to the top of the page
 
+Quote Post
VYK
сообщение Mar 10 2007, 22:20
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 13-11-06
Пользователь №: 22 252



Цитата(VYK @ Mar 10 2007, 18:49) *
Уважаемые господа!
Пытаюсь разобраться с USB для AT91SAM7S64. Для изучения использую пример AT91SAM7S64-BasicUSART_USB для IAR.
При передаче ASCII-кодов с помощью терминальной программы в устройство оно, соответственно, передаёт их обратно в компьютер, как и должно быть, без искажений. Как только я попытался с помощью собственной коммуникационной компьютерной программы передать в устройство / принять из устройства бинарный поток (0х00...0хFF), то обнаружил следующую проблему. С помощью функции Read бинарный поток принимается без искажений, а вот передача из устройства в компьютер с помощью функции Write происходит с искажениями: как только в потоке встречается байт 0х00, то все следующие за ним байты начинают передаваться как 0xCD. Что это может быть? Сталкивался ли кто-нибудь с этим?
Заранее благодарю за помощь и совет.


Прошу прощения, разобрался, данный пример - рабочий, а вот "искажения" были обусловлены неучтёнными мною "особенностями" коммуникационной компоненты компьютерной программы.
Go to the top of the page
 
+Quote Post
nameless
сообщение Mar 12 2007, 13:23
Сообщение #3


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

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



Цитата(VYK @ Mar 10 2007, 22:20) *
Цитата(VYK @ Mar 10 2007, 18:49) *

Уважаемые господа!
Пытаюсь разобраться с USB для AT91SAM7S64. Для изучения использую пример AT91SAM7S64-BasicUSART_USB для IAR.
При передаче ASCII-кодов с помощью терминальной программы в устройство оно, соответственно, передаёт их обратно в компьютер, как и должно быть, без искажений. Как только я попытался с помощью собственной коммуникационной компьютерной программы передать в устройство / принять из устройства бинарный поток (0х00...0хFF), то обнаружил следующую проблему. С помощью функции Read бинарный поток принимается без искажений, а вот передача из устройства в компьютер с помощью функции Write происходит с искажениями: как только в потоке встречается байт 0х00, то все следующие за ним байты начинают передаваться как 0xCD. Что это может быть? Сталкивался ли кто-нибудь с этим?
Заранее благодарю за помощь и совет.


Прошу прощения, разобрался, данный пример - рабочий, а вот "искажения" были обусловлены неучтёнными мною "особенностями" коммуникационной компоненты компьютерной программы.



Не могли бы Вы пояснить - где именно эти особенности. У меня похожая проблема - и именно 0xCD вылетает.
Go to the top of the page
 
+Quote Post
VYK
сообщение Mar 12 2007, 14:55
Сообщение #4





Группа: Новичок
Сообщений: 7
Регистрация: 13-11-06
Пользователь №: 22 252



Цитата(nameless @ Mar 12 2007, 13:23) *
Не могли бы Вы пояснить - где именно эти особенности. У меня похожая проблема - и именно 0xCD вылетает.


Господа, прошу прощения за вынужденный отход от темы форума, поскольку кратко должен ответить на заданный вопрос.
Использую для разработки компьютерной терминальной программы VC. Для информационного обмена по COM-порту (USB/CDC) использую компоненту MSComm (м.б. это и не самое лучшее решение; раньше пользовался API). Эта компонента предполагает использование универсального типа VARIANT.


// Ф-ция-обработчик событий
void <Имя_класса>::OnCommEvent() {
int inBufferCount;
BYTE *pcBuffer;
VARIANT var;


var.vt = VT_UI1 | VT_BYREF;

// Обработка событий
switch(m_com.get_CommEvent()) {
// Передача символов
case 1: // vbMSCommEvSend:
break;

// Приём символов
case 2: // vbMSCommEvReceive:
// Определяем величину буфера
inBufferCount = m_com.get_InBufferCount();
// Считываем принятые данные из буфера var
var = m_com.get_Input();
// и преобразуем их к (BYTE*)
pcBuffer = var.pbVal;

Если Вы сделаете примерно так, то получите готовый к дальнейшей обработке pcBuffer.
Моя ошибка состояла в том, что я использовал для получения данных из буфера поле var.bstrVal, т.е. строковое поле союза. А известно, что для строк символ 0х00 является признаком их окончания (нуль-терминатор). Вот и получалось, что вроде бы размер принятого буфера inBufferCount соответствовал количеству переданных из устройства байт, а вот все что было после 0х00 воспринималось как 0хcd.
Так что всё было, как всегда, очень просто.
А вот пример с учётом рекомендаций уважаемого участника форума Master'а - вполне рабочий, хотя, по-хорошему, придётся переделывать работу с USB по прерваниям.
Если будут вопросы не по теме ARM, то - в личку.
Go to the top of the page
 
+Quote Post

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

 


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


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