Страница 1 из 1

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

Добавлено: Ср сен 09, 2020 23:02:11
danya361
Помогите пожалуйста с написанием функции принятия строки по uart в codevisionavr. Чтобы при отправке в терминале, например числа 223,пришло это число, а не отдельно 3 символа

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

Добавлено: Чт сен 10, 2020 08:57:39
OKF
Принимайте в буфер до CR или таймаута, затем число = atoi(буфер);

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

Добавлено: Чт сен 10, 2020 09:06:19
NStorm
а не отдельно 3 символа
UART в AVR всегда принимает отдельно только символ по-сути. Это уже вам надо компоновать их во что нужно. Собирайте буфер и работайте с ним. Примеров в Интернете вагон и маленькая тележка.

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

Добавлено: Чт сен 10, 2020 10:30:39
Jack_A
[uquote="NStorm",url="/forum/viewtopic.php?p=3890428#p3890428"]UART в AVR всегда принимает отдельно только символ по-сути.[/uquote]
Точнее - принимает байт. Что за байт - символ или бинарная информация - ему до лампы. Это определяется уже верхним, логическим уровнем протокола. Далеко за примерами не ходить : Modbus ASCII и RTU mode .

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

Добавлено: Чт сен 10, 2020 13:45:02
danya361
Если бы я не пробовал собрать байты, я бы не написал сюда. Может кто нибудь помочь с кодом

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

Добавлено: Чт сен 10, 2020 14:35:03
Jack_A
Число - из 3 цифр? Как 2 байта переслать. До сияющих высот кодевижена я не поднимался, а на псевдокоде это звучало бы приблизно так :
первую цифру & 0Fh * 10 -> r1
((вторую цифру & 0Fh) + r1 )* 10 -> r1
(третью цифру & 0Fh) + r1 -> r1
Всё. В r1 имеем число.

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

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

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

Добавлено: Чт сен 10, 2020 21:40:50
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) ;
}
}
Пробовал так не получается

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

Добавлено: Пт сен 11, 2020 11:24:55
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.