Страница 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.