Цитата(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, то - в личку.