Перейти к содержанию
    

Чтение строки микроконтроллером

5 минут назад, Entomo сказал:

Но светодиод погасить/зажечь не удается. Вот фрагмент кода:

Все у вас работает согласно программе. Нужно подучить язык Си.
mystring это массив из 20-и байт. Указание этого имени без индекса означает адрес первого байта.
Выражение
if (mystring == '1')
означает, что вы сравниваете адрес массива с кодами 0x30 и 0x31.
Для сравнения байта пишите
if (mystring[0] == '1')
но это только один первый байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, MrBearManul сказал:

Идём учить Си. Совершенно неправильно так делать. Вы сравниваете значение указателя с аски-кодом цифры 1. Думаю, что в 99,999% на любой системе это сравнение всегда будет ложным.

Но там еще другая проблема: если использовать Ваш фрагмент то при контроле содержимого string после введения каждого символа тут же отображается только этот символ. То есть у меня по Вашему коду не формируется строка хотя бы из двух символов. Символ введенный с терминала (он же string) тут же отображается. То есть размер string никогда не превышает одного символа 

То есть я по-прежнему могу вводить в качестве управляющего только один символ а не строку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, Entomo сказал:

есть у меня по Вашему коду

Я вам предоставил пример. Модифицируйте код под себя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Организовываете бесконечный цикл, в котором проверяете, не пришел - ли новый символ в UART. Если пришел - кладете этот символ в буфер строки. Если этот символ является символом конца строки (<CR>, <LF>, 0) - посылаете всю строку куда Вам надо (например, на терминал). После этого приводите буфер строки в начальное состояние и начинаете все сначала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, MrBearManul сказал:

Можно. Для стандартной нуль-терминированной строки.


char mystring[20]; // выбираете размер так, чтобы с самой большой гипотетической строкой не было переполнения, хотя такое и невозможно

int idx = 0;
memset(mystring, 0, sizeof(mystring));
while(idx < sizeof(mystring-1)) {
  char c = UART_get_char();
  if(c == '\0' || c == '\r' || c == '\n')
    break;
  mystring[idx++] = c;
}
// здесь у вас в mystring будет нуль-терминированная принятая строка

 

У меня уже все получилось... но только после того как я исправил в предоставленном мне коде один фрагмент: вместо (mystring-1) я написал (mystring)-1 . Как я должен к этому относится ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, Entomo said:

У меня уже все получилось... но только после того как я исправил в предоставленном мне коде один фрагмент: вместо (mystring-1) я написал (mystring)-1 . Как я должен к этому относится ?

а это MrBearManul, уже сходивший и изучивший С,  вычитает из указателя единицу :)

 

просто опечатка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как к правильному решению. Sizeof возвращает размер явно заданного массива в байтах. Mystring - это указатель на этот массив или по простому - его начальный адрес. Mystring -1  - "левый адрес"

Изменено пользователем Aleksandr Baranov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Entomo сказал:

Как я должен к этому относится ?

Допустил ошибку. Я думаю, что простительно. Тем более, ваш код я набил прямо в форме форума. Не проверяя. Да и на чём мне его проверять??? Я думаю для меня это более, чем простительно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Entomo сказал:

Как я должен к этому относится ?

Вот именно так:

3 часа назад, Entomo сказал:

Всем спасибо !

Если надеетесь на помощь и в дальнейшем. Поймите, Вас хотят не запутать, а научить рассуждать. И, как видим, есть результаты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...