Приём строки по uart

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Пт авг 07, 2020 16:28:04

Сообщение danya361 »

Помогите пожалуйста с написанием функции принятия строки по uart в codevisionavr. Чтобы при отправке в терминале, например числа 223,пришло это число, а не отдельно 3 символа
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Принимайте в буфер до CR или таймаута, затем число = atoi(буфер);
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

а не отдельно 3 символа
UART в AVR всегда принимает отдельно только символ по-сути. Это уже вам надо компоновать их во что нужно. Собирайте буфер и работайте с ним. Примеров в Интернете вагон и маленькая тележка.
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

[uquote="NStorm",url="/forum/viewtopic.php?p=3890428#p3890428"]UART в AVR всегда принимает отдельно только символ по-сути.[/uquote]
Точнее - принимает байт. Что за байт - символ или бинарная информация - ему до лампы. Это определяется уже верхним, логическим уровнем протокола. Далеко за примерами не ходить : Modbus ASCII и RTU mode .
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 3
Зарегистрирован: Пт авг 07, 2020 16:28:04

Сообщение danya361 »

Если бы я не пробовал собрать байты, я бы не написал сюда. Может кто нибудь помочь с кодом
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Число - из 3 цифр? Как 2 байта переслать. До сияющих высот кодевижена я не поднимался, а на псевдокоде это звучало бы приблизно так :
первую цифру & 0Fh * 10 -> r1
((вторую цифру & 0Fh) + r1 )* 10 -> r1
(третью цифру & 0Fh) + r1 -> r1
Всё. В r1 имеем число.
Изображение
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

[uquote="danya361",url="/forum/viewtopic.php?p=3890518#p3890518"]Если бы я не пробовал собрать байты, я бы не написал сюда. Может кто нибудь помочь с кодом[/uquote]
Чем вам помочь? Где ваш код? Что не получается?
Пока что вы просите или написать код за вас или нагуглить за вас.
Помогу частично со вторым: https://lmgtfy.com/?q=%D0%BF%D1%80%D0%B ... E+uart+avr
Родился
Сообщения: 3
Зарегистрирован: Пт авг 07, 2020 16:28:04

Сообщение danya361 »

void send_Uart(unsigned char c)// Отправка байта
{
while(!(UCSRA&(1<<UDRE))) // Устанавливается, когда регистр свободен
{}
UDR = c;
}

void send_Uart_str(unsigned char *s)// Отправка строки
{
while (*s != 0) send_Uart(*s++);
}
unsigned char getch_Uart(void) // Получение байта
{
while(!(UCSRA&(1<<RXC))) // Устанавливается, когда регистр свободен
{}
return UDR;
}
Void main()
{
Uart_init() ;
While(1)
{
const short SIZE = 8;
char text[SIZE];

if(UCSRA&(1<<RXC)) // если пришёл байт по UART
{


for(int i=0;i<SIZE;i++)
{
text=getch_Uart();

}
Send_Uart_Str(text) ;
}
}
Пробовал так не получается
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Надеюсь с регистрами это у вас при вставке ошибки произошли. Потому что C - регистрозависимый язык. И Uart_init() не хватает. Плюс там ошибочка с длиной. Сейчас поправлю.

Добавлено after 1 hour 36 minutes 54 seconds:

Код: Выделить всё

#include <avr/io.h>
#include <stdio.h>

void send_Uart(unsigned char c) // Отправка байта
{
  while (!(UCSRA & (1 << UDRE))); // Устанавливается, когда регистр свободен
  UDR = c;
}

void send_Uart_str(unsigned char *s) // Отправка строки
{
  while (*s != 0) {
   send_Uart(*s);
   s++;
  }
}

unsigned char getch_Uart(void) // Получение байта
{
  while (!(UCSRA & (1 << RXC))); // Устанавливается, когда регистр свободен
  return UDR;
}

int main() {
    Uart_init();
    while(1) {
      const short SIZE = 9;
      unsigned char text[SIZE];

      if (UCSRA & (1 << RXC)) // если пришёл байт по UART
      {

        for (int i = 0; i < SIZE-1; i++) {
          text[i] = getch_Uart();

        }
        send_Uart_str(text);
      }
    }
    while(1);
}
Обратите внимание, что размер массива строки должен быть на 1 больше, чем полезной инфы, т.к. в конце он должен быть терминирован \0.
Ответить

Вернуться в «AVR»