Как преобразовать прочитанные символы в строки?
Как я могу добавить строку, например "AA 00 01 00 FF FF A2", к последовательным данным с помощью Arduino?
Следующий код кажется неправильным:
String comdata;
void loop() {
while (Serial2.available() > 0) {
c = Serial2.read();
//c is "AA 00 01 00 FF FF A2"
comdata +=c;
}
if(comdata.length()>0){
Serial.println(comdata);
//YES on HEX mode ;print "AA 00 01 00 FF FF A2"
}
delay(1000);
}
@b7ur, 👍1
Обсуждение4 ответа
▲ 0
Если я правильно понял ваш вопрос, то, пожалуйста, попробуйте следующий код:
uint8_t str[64];
uint8_t chrCtr = 0;
uint16_t twoChr;
boolean isSecondChr = false;
void setup()
{
Serial.begin(57600);
}
void loop()
{
uint8_t chr;
while (Serial.available())
{
chr = Serial.read();
if ('a' <= chr && chr <='f')
{
chr &= 0x5F; // make it uppercase
}
if ('0' <= chr && chr <= '9' || 'A' <= chr && chr <= 'F')
{
if (!isSecondChr)
{
twoChr = chr << 8;
isSecondChr = true;
}
else
{
twoChr |= chr;
isSecondChr = false;
str[chrCtr++] = hexToAscii(twoChr);
if (chrCtr == 63)
{
str[chrCtr] = 0; // A string always terminated by zero
Serial.println((char *)str);
chrCtr = 0;
}
}
}
else if (chr == '#') // input terminated
{
str[chrCtr] = 0; // A string always terminated by zero
Serial.println((char *)str);
chrCtr = 0;
}
else
{
isSecondChr = false;
// other character will be dropped
}
}
}
uint8_t hexToAscii(uint16_t hexWord)
{
return (hexToBin(highByte(hexWord)) << 4) + hexToBin(lowByte(hexWord));
}
uint8_t hexToBin(uint8_t hexByte)
{
return hexByte <= '9' ? hexByte - 48 : hexByte - 55;
}
,
@ZulNs
▲ 0
Если вы объявите переменную c
как символ
, то ваш скетч выведет "AA 00 01 00 FF FF A2" на последовательный монитор.
String comdata;
void setup(){
Serial.begin(9600);
}
void loop(){
while(Serial.available() > 0){
// Input is "AA 00 01 00 FF FF A2"
char c = Serial.read();
comdata +=c;
}
if(comdata.length() > 0){
Serial.println(comdata);
// Prints "AA 00 01 00 FF FF A2"
}
delay(1000);
}
,
@VE7JRO
▲ 0
Я понял. моя функция записи для преобразования, ее работа! Спасибо
String tohex(int n) {
if (n == 0) {
return "00"; //n为0
}
String result = "";
char _16[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
const int radix = 16;
while (n) {
int i = n % radix;
result = _16[i] + result;
n /= radix;
}
if (result.length() < 2) {
result = '0' + result;
}
return result;
}
,
@singmj
Пожалуйста, отредактируйте свой ответ, чтобы объяснить, в чем заключалось решение, чтобы оно было полезно другим читателям в будущем., @MichaelT
▲ 0
String readString;
char c;
void setup() {
Serial2.begin(9600);
}
void loop()
{
while (Serial2.available()) {
delay(3); //задержка для заполнения буфера
if (Serial2.available() > 0) {
c = Serial2.read(); //получает один байт из последовательного буфера
readString += c; //делает строку readString
}
}
if (readString.length() > 0)
{
Serial2.println(readString);
}
}
,
@Sergey Kuntsevich
Смотрите также:
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Как отправить символ "с"? как символ ascii ‘A’ ‘A’ ‘0’ ‘0’ ... ? или как числовое значение ‘0xAA’ ‘0x00’ ?, @leoc7
Я знаю, что вы могли бы сделать " Serial.ReadString ()", чтобы получить весь буфер в виде строки. Не существует ли
Serial2.ReadString ()
?, @Levi Lesches