Jump to content

    
Sign in to follow this  
Entomo

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites
1 минуту назад, MrBearManul сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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 . Как я должен к этому относится ?

Share this post


Link to post
Share on other sites
8 minutes ago, Entomo said:

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

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

 

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

Share this post


Link to post
Share on other sites

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

Edited by Aleksandr Baranov

Share this post


Link to post
Share on other sites
11 минут назад, Entomo сказал:

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

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

Share this post


Link to post
Share on other sites
3 часа назад, Entomo сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this