0x9B (155decimal) специальный управляющий символ? Почему он отсутствует в таблицах ascii? - PullRequest
8 голосов
/ 15 апреля 2010

Я работаю над встроенной системой, и у меня есть драмы, заставляющие ее посылать определенный кусок данных через последовательный порт. Я сузил его и обнаружил, что если в сообщении присутствует 0x9B, оно повреждает сообщение.

Итак, я смотрю 0x9b (155) на http://www.asciitable.com/,, и его не хватает! Разве это не странное совпадение!

Есть идеи, это специальный персонаж или что-то в этом роде?

-edit- Хорошо, извините, ребята, это был не 0x9b, это был символ 0x11. Какой ... барабанная дробь ... является символом XON / XOFF. У меня по ошибке было управление потоком как xon / xoff на компьютере, и никакого контроля потока на устройстве! В любом случае, спасибо за помощь.

Ответы [ 5 ]

6 голосов
/ 15 апреля 2010

В экранирующих последовательностях ANSI 0x9B - это односимвольный Ввод контрольной последовательности (более знакомая многосимвольная версия - ESC-[.

3 голосов
/ 15 апреля 2010

0x9B - это CSI или «Представитель последовательности управления», входящий в набор кодов управления C1, см. Здесь: http://www.search.com/reference/C0_and_C1_control_codes

Предполагая, что данные проходят через слой, который обрабатывает управляющие коды C1, неудивительно, что после этого символа пропущено несколько байтов, поскольку он используется для указания начала escape-последовательности ANSI. Байты исчезают, потому что какой-то слой удаляет их как часть инструкции. Подробнее об этом здесь: http://en.wikipedia.org/wiki/Control_Sequence_Introducer

Очевидно, я не могу гарантировать, что это ваша проблема, но я бы начал копаться в документации API, основываясь на описанных вами симптомах.

2 голосов
/ 15 апреля 2010

Если символ перед 0x9B равен 0x10 (DLE - escape-символ канала передачи данных), это может объяснить потерянные символы, которые вы видите. Некоторые устройства используют DLE в качестве индикатора команды управления, а последующим символом является команда. Если символы DLE не экранированы, обычным признаком является потеря 2 символов в потоке или странное поведение устройства. Побег DLE символов с DLE. Итак, в вашем случае, если ваш поток данных включает в себя:

... 0x10 0x9b ...

вы должны написать

... 0x10 0x10 0x9b ...

1 голос
/ 15 апреля 2010

Я предполагаю, что это 0x1B, то есть escape-символ ASCII, с битом четности в 8-й позиции бита (он поступает из последовательной связи и все).

Технически, все символы в наборе ASCII меньше или равны 0x7F , символы от 0x80 до 0xFF являются частью расширенного ASCII . Значение кодов выше 0x7F обычно варьируется, что позволяет обрабатывать один из нескольких наборов символов с кодами размером всего один байт. Эта возможность, к сожалению, вносит неоднозначность, так как нужно знать конкретный используемый дополнительный набор символов (если хотите, «кодовую страницу»).
Например, таблица «ASCII», на которую есть ссылка в вопросе, похоже, не имеет никакого символа, связанного с 0x9B, в то время как многие другие расширенные наборы ASCII используют это для «простого» / отображаемого символа (например: > выглядящий символ в ISO -8859-1, знак цента (символ c-like) с другим набором и т. Д.

Следовательно, возможное значение символа 0x9B может зависеть от [подразумеваемого] набора символов, используемого в базовом приложении. Но, как уже говорилось ранее, похоже, что символы кодируются в 7 битах (следовательно, это, вероятно, "чистые" символы ASCII) с одним битом четности.

0 голосов
/ 15 апреля 2010

Для любого, кто придет к этому вопросу только из-за заголовка: 0x9B / 155 отсутствует в таблицах ASCII, потому что это не символ ASCII. ASCII-символы имеют ширину всего 7 бит, то есть их всего 128, просто равно нет символа 155.

[Сообщество Wiki, потому что оно на самом деле не отвечает на вопрос, только заголовок.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...