Можно ли читать расширенный ASCII из последовательного порта?

Мой проект требует, чтобы Serial.read() мог принимать расширенные символы ASCII (0x80 <=> <=> 0xFF). Например, я ожидал бы, что чтение символа ¥ даст десятичное значение 157. Вместо этого команда read() имеет два успешных чтения со значениями: 194 и 165. Конечно, я мог бы создать таблицу поиска и преобразовать, но это не жизнеспособный вариант. Я соответствую стандартному протоколу Grbl, который использует эти однобайтовые расширенные символы ASCII в качестве прерываний. Такая двухбайтовая структура исключает простой подход peek/read, необходимый протоколом.

Edit Я попытался упростить вопрос для этого контекста, но не смог учесть тот факт, что Arduino IDE будет отправлять входные данные как Unicode. Несмотря на это, он по-прежнему не работает при прямой отправке байтов. А именно, если я отправлю байт 0x93 через C# как последовательный.Write("\u0093"), Serial.read() Arduino не видит доступных байтов. Отправка обычного ASCII, например, последовательного.Пишите("\u0018"), работает нормально.

, 👍0

Обсуждение

последовательный порт-это просто труба ... что вы в него запихнете, зависит только от вас ... обычно последовательный порт передает 8-битные данные (байты) ... что эти данные значат для вас, последовательному порту неизвестно ... если вы видите два байта, то, вероятно, вы передаете ЮНИКОД, а не ASCII ... в любом случае, это не имеет никакого отношения к последовательному порту, @jsotola

@jsotola глупо со мной; Я попытался упростить вопрос с помощью IDE. Я отредактировал вопрос, чтобы отразить, что он также не работает, когда я отправляю байты напрямую, например, используя класс сериального порта C#., @Zane Claes

Ваш отредактированный вопрос теперь касается C#, а не Arduino. Вы должны спросить “_Как я могу отправить "0x93" через последовательный порт в C#?_” в более подходящем месте., @Edgar Bonet

@EdgarBonet, если у вас есть независимый способ легко отправлять/получать байты непосредственно с последовательного порта, я весь внимание. Я не знаком с каким-либо способом сделать это с помощью оболочки и поэтому использовал эти прокси., @Zane Claes

Я не знаю C#, и я не знаю, что вы подразумеваете под “_агностикой". Если под “_shell-ish_” вы подразумеваете “из оболочки Unix”, в bash работает следующее: `echo -ne "\x93" > /dev/ttyACM0". Но опять же, речь идет не об Arduino, а о выбранной вами оболочке/среде/языке программирования., @Edgar Bonet

Под агностиком я имею в виду именно то, что вы говорите — как это можно протестировать, не вводя разрушающее влияние оболочки/языка программирования и т. Д.? Потому что команда оболочки демонстрирует ту же проблему, что и C# (Serial.available() == 0)., @Zane Claes

См. Раздел [Отключить сброс при подключении/Отключении Com-Порта](https://arduinoprosto.ru/q/38468/7508), @Edgar Bonet


1 ответ


Лучший ответ:

1

Да, конечно, вы можете прочитать любую последовательность байтов. Как вы уже испытали, если вы посылаете байтовые значения 194 и 165, ваш Arduino надежно считывает 194 и 165.

Теперь вы должны знать, что есть тонны несовместимых кодировок символов, которые все могут быть названы “расширенными ASCII”. Я не знаю, что вы имеете в виду. Может быть, есть такая кодировка, где “¥” имеет кодовую точку 157. Однако в настоящее время практически любая современная компьютерная система использует Юникод и сериализует символы с помощью UTF-8. Характер “¥” сериализуется в UTF-8 как пара байтов 194 и 165.

Если вы хотите использовать протокол Grbl, отправляйте прерывания как байты, не думайте о них как о “символах”.

,

Ack, конечно, я забыл указать IDE, использующую юникод. Пожалуйста, ознакомьтесь с отредактированным вопросом. Также, пожалуйста, обратите внимание, что я определил "расширенный ASCII" в ОП., @Zane Claes

@ZaneClaes: Если под “расширенным ASCII” вы подразумеваете диапазон байтов 0x80–0xff, это не то, что большинство людей называют “расширенным ASCII”. В общем, под этими словами понимается любая из множества кодировок символов (обычно 8-разрядных кодировок), совместимых с ASCII, и, таким образом, “расширяющих” ASCII. Если вы “ожидаете, что чтение символа ¥ приведет к десятичному значению 157_”, то вы думаете об одной такой кодировке., @Edgar Bonet

тот факт, что фраза может иметь несколько интерпретаций, именно поэтому я уточнил точный диапазон значений, о котором говорил ;) В комментариях к документам Grbl эти прерывания называются "расширенным ascii", поэтому я просто копировал их соглашение., @Zane Claes