Я работаю над встроенной системой, и у меня есть драмы, заставляющие ее отправить определенный блок данных через последовательный порт. Я сузил его и нашел, что, если 0x9B присутствует в сообщении, он повреждает сообщение.
Таким образом, я затем ищу 0x9b (155) на http://www.asciitable.com/, и он отсутствует! Не то, что причудливое совпадение!
Какие-либо идеи, действительно ли это - специальный символ или что-то?
- редактирование - Хорошо извините парни, это не был 0x9b, вызывающий это, это был 0x11 символ. Который... барабан... является символом XON/XOFF. У меня по ошибке было управление потоком как xon/xoff на компьютере и никаком управлении потоком на устройстве! Спасибо за справку так или иначе.
Если символ перед 0x9B равен 0x10 (DLE - escape-символ канала данных), это может объяснить потерянные символы, которые вы видите. Некоторые устройства используют DLE в качестве индикатора управляющей команды, а последующий символ - это команда. Если символы DLE не экранируются, обычным признаком является потеря 2 символов в потоке или странное поведение устройства. Для экранирования символов DLE используется DLE. Итак, в вашем случае, если ваш поток данных включает:
... 0x10 0x9b ...
, вам нужно будет написать
... 0x10 0x10 0x9b ...
0x9B - это CSI или «Control Sequence Introducer», его часть набора управляющих кодов C1, см. Здесь: http://www.search.com/reference/C0_and_C1_control_codes
Предполагая, что данные проходят через слой, обрабатывающий управляющие коды C1, неудивительно, что после этого символа пропущено несколько байтов, поскольку он используется для обозначения начала escape-последовательности ansi. Байты исчезают, потому что какой-то уровень отключает их как часть инструкции. Подробнее об этом здесь: http://en.wikipedia.org/wiki/Control_Sequence_Introducer
Очевидно, не могу гарантировать, что это ваша проблема, но я бы начал копаться в документации api, основываясь на симптомах, которые вы описано.
В управляющих последовательностях ANSI, 0x9B
является односимвольным Control Sequence Introducer (многосимвольный версия, которая более знакома, - ESC - [
.
Для тех, кто задает этот вопрос только из-за заголовка: 0x9B
/ 155
отсутствует в таблицах ASCII потому что это не символ ASCII. Символы ASCII имеют ширину всего 7 бит, то есть их всего 128, просто равно нет символа 155.
[Community Wiki, потому что это на самом деле не отвечает на вопрос, только заголовок.]
Я предполагаю, что это 0x1B, то есть escape-символ ASCII, с битом четности в 8-м разряде (он поступает из последовательной связи и все такое).
Технически все символы в наборе ASCII меньше или равны 0x7F , символы от 0x80 до 0xFF являются частью расширенного ASCII . Значение кодов выше 0x7F обычно варьируется, что позволяет обрабатывать один из нескольких наборов символов с кодами размером ровно один байт. Эта возможность, к сожалению, вводит двусмысленность, поскольку нужно знать конкретный дополнительный набор символов, который используется («кодовая страница», если хотите).
Например, таблица "ASCII", на которую ссылается вопрос, похоже, не имеет никакого символа, связанного с 0x9B, в то время как многие другие расширенные наборы ASCII используют это для "простого" / отображаемого символа (например: символ >
в ISO-8859-1, знак цента (символ типа c) с другим набором и т. д.
Следовательно, возможное значение символа 0x9B может зависеть от [подразумеваемого] набор символов, используемый в базовом приложении. Но, как было сказано ранее, это больше похоже на то, что символы закодированы в 7-битном формате (следовательно, это, вероятно, «чистые» символы ASCII) с одним битом четности.