#c #arduino
#c #arduino
Вопрос:
Я пытаюсь написать программу, которая может считывать строку из ввода последовательного монитора и подсчитывать размер символов в качестве входных данных и сохранять входные данные в массив, но у меня есть некоторые проблемы с тем, что последовательный монитор останется последними входными данными, например, если я введу ABC, он покажет «Размервходных данных = 3 символа» затем я снова ввожу ABC, останутся последние данные, которые я ввел ранее, я уже сбросил их = 0 какую ошибку я совершаю?
Последовательный монитор показывает:
Пожалуйста, введите
Размер входных данных = 3 символа
ABC
Пожалуйста, введите
Пожалуйста, введите
Размер входных данных = 7 символов
ABC
ABC
вот мой код:
String Msg ; char buf[1200]={0} ; // this is an array char input; int num=0; void setup() { // Initialize serial and wait for port to open: Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } }
void loop() {
while (Serial.available())
{
input = (char)Serial.read();
if(input != 'n' )
{
buf[num] = input;
Msg =input;
num ;
}
else{
buf[num ] = input; // last character is newline
buf[num] = 0; // string array should be terminated with a zero
Serial.println("Please input");
Serial.print("Size of input data = ");
Serial.print(Msg.length());
Serial.print(" characters");
Serial.println("");
Serial.println(Msg);
Serial.println("Please input");
Serial.println("");
Serial.println("");
for(int i=0; i<num ;i ){
Msg[i]=0;
buf[i] =0;
}
}
num=0;
}
return;
}
Комментарии:
1. извините, я должен исправить размер входных данных = 6 символов, а не 7 символов
2. ваша проблема не в том, что вы не можете очистить массив. вам не удается очистить строку. По крайней мере, это то, что вы печатаете содержимое и размер. массив не используется в вашем выводе
Ответ №1:
Согласно руководству Arduino, строковый []
оператор выполняет то же charAt()
самое, что и . Поскольку есть также setCharAt()
функция, я полагаю []
, и charAt()
доступна только для чтения.
В руководстве этого не сказано, но зачем им setCharAt()
тогда.
Просто назначьте пустую строку Msg
, чтобы очистить ее.
Msg = "";
Ответ №2:
Вы делаете это неправильно.
Msg — это переменная строкового типа, а не массив, поэтому вы можете просто очистить строку, как показано ниже.
Msg="";
Не используйте ненужный цикл for для очистки массива буфера символов, вы можете сделать это лучше, используя функцию memset .
memset(buf, 0, sizeof(buf));
и, наконец, возьмите «num = 0;» внутри цикла else, чтобы он был равен нулю после завершения, а не каждый раз, когда выполняется цикл.
Итак, окончательный протестированный код будет выглядеть следующим образом,
String Msg ;
char buf[1200] = {0} ; // this is an array
char input;
int num = 0;
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial)
{
; // wait for serial port to connect. Needed for native USB port only
}
}
void loop() {
while (Serial.available())
{
input = (char)Serial.read();
if (input != 'n' )
{
buf[num] = input;
Msg = input;
num ;
}
else {
buf[num ] = input; // last character is newline
buf[num] = 0; // string array should be terminated with a zero
Serial.println("Please input");
Serial.print("Size of input data = ");
Serial.print(Msg.length());
Serial.print(" characters");
Serial.println("");
Serial.println(Msg);
Serial.println("Please input");
Serial.println("");
Serial.println("");
Msg ="";
memset(buf, 0, sizeof(buf));
num = 0;
}
}
return;
}