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


Прошу прощения, разобрался, данный пример - рабочий, а вот "искажения" были обусловлены неучтёнными мною "особенностями" коммуникационной компоненты компьютерной программы.
nameless
Цитата(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 вылетает.
VYK
Цитата(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, то - в личку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.