Можно ли читать расширенный 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")
, работает нормально.
@Zane Claes, 👍0
Обсуждение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
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
последовательный порт-это просто труба ... что вы в него запихнете, зависит только от вас ... обычно последовательный порт передает 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