Приём строки по uart
- Сообщения: 3
- Зарегистрирован: Пт авг 07, 2020 16:28:04
Помогите пожалуйста с написанием функции принятия строки по uart в codevisionavr. Чтобы при отправке в терминале, например числа 223,пришло это число, а не отдельно 3 символа
- Реклама
- Сообщения: 1405
- Зарегистрирован: Вт июн 07, 2011 08:03:18
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
UART в AVR всегда принимает отдельно только символ по-сути. Это уже вам надо компоновать их во что нужно. Собирайте буфер и работайте с ним. Примеров в Интернете вагон и маленькая тележка.а не отдельно 3 символа
[uquote="NStorm",url="/forum/viewtopic.php?p=3890428#p3890428"]UART в AVR всегда принимает отдельно только символ по-сути.[/uquote]
Точнее - принимает байт. Что за байт - символ или бинарная информация - ему до лампы. Это определяется уже верхним, логическим уровнем протокола. Далеко за примерами не ходить : Modbus ASCII и RTU mode .
Точнее - принимает байт. Что за байт - символ или бинарная информация - ему до лампы. Это определяется уже верхним, логическим уровнем протокола. Далеко за примерами не ходить : Modbus ASCII и RTU mode .
- Сообщения: 3
- Зарегистрирован: Пт авг 07, 2020 16:28:04
Если бы я не пробовал собрать байты, я бы не написал сюда. Может кто нибудь помочь с кодом
- Реклама
Число - из 3 цифр? Как 2 байта переслать. До сияющих высот кодевижена я не поднимался, а на псевдокоде это звучало бы приблизно так :
первую цифру & 0Fh * 10 -> r1
((вторую цифру & 0Fh) + r1 )* 10 -> r1
(третью цифру & 0Fh) + r1 -> r1
Всё. В r1 имеем число.
первую цифру & 0Fh * 10 -> r1
((вторую цифру & 0Fh) + r1 )* 10 -> r1
(третью цифру & 0Fh) + r1 -> r1
Всё. В r1 имеем число.
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
[uquote="danya361",url="/forum/viewtopic.php?p=3890518#p3890518"]Если бы я не пробовал собрать байты, я бы не написал сюда. Может кто нибудь помочь с кодом[/uquote]
Чем вам помочь? Где ваш код? Что не получается?
Пока что вы просите или написать код за вас или нагуглить за вас.
Помогу частично со вторым: https://lmgtfy.com/?q=%D0%BF%D1%80%D0%B ... E+uart+avr
Чем вам помочь? Где ваш код? Что не получается?
Пока что вы просите или написать код за вас или нагуглить за вас.
Помогу частично со вторым: https://lmgtfy.com/?q=%D0%BF%D1%80%D0%B ... E+uart+avr
- Сообщения: 3
- Зарегистрирован: Пт авг 07, 2020 16:28:04
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) ;
}
}
Пробовал так не получается
{
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
Надеюсь с регистрами это у вас при вставке ошибки произошли. Потому что C - регистрозависимый язык. И Uart_init() не хватает. Плюс там ошибочка с длиной. Сейчас поправлю.
Добавлено after 1 hour 36 minutes 54 seconds:
Обратите внимание, что размер массива строки должен быть на 1 больше, чем полезной инфы, т.к. в конце он должен быть терминирован \0.
Добавлено 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);
}



