Перейти к содержанию

CVAvr Uart Нужна помощь


CooperFile

Рекомендуемые сообщения

Всем привет. CVAVR начал осваивать только недавно. Да и вообще раньше не особо работал с UART. Такой вопрос. Допустим по UART приходят строки типа:

T:21.33 E:0 B:73.0 
T:21.29 E:0 B:73.1 
T:21.25 E:0 B:73.2 

Каким образом можно вытягивать нужную информацию? С последующим выводом в нужные места? Можете показать пример и тыкнуть носом? Заранее спасибо за помощь!
 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вопрос - ни о чём. Какие то отрывки из мыслей.
Что значит "вытягивать", что за "нужная" такая информация ? Что за "вывод" и какие такие "нужные места" ?

 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

В ‎09‎.‎03‎.‎2017 в 16:05, CooperFile сказал:

Каким образом можно вытягивать нужную информацию? С последующим выводом в нужные места?

Ну тут все ясно как божий день.

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

char rx_buffer[] = "T:21.33 E:0 B:73.0";// к примеру по uart нам прилетело это
char T[7], E[7], B[7];
float Temperatura, Energy, Barrel;
 
int main(void)
{
	char i = 0;
	while(rx_buffer[i] != '\0'){
		if(rx_buffer[i] == 'T'){
		 	for(char r=0; r<7; r++){
			 	if(rx_buffer[i+r+2] == ' ') break;
			 	T[r] = rx_buffer[i+2+r];
		 	}
	 	}
		if(rx_buffer[i] == 'E'){
			for(int r=0; r<7; r++){
				if(rx_buffer[i+r+2] == ' ') break;
				E[r] = rx_buffer[i+2+r];
			}
		}
 	 	if(rx_buffer[i] == 'B'){
	 	 	for(int r=0; r<7; r++){
		 	 	if(rx_buffer[i+r+2] == '\0') break;
		 	 	B[r] = rx_buffer[i+2+r];
	 	 	}
 	 	}
 		i++;
	 }
	 Temperatura = atof(T); Energy = atof(E); Barrel = atof(B);

while(1);
}

В массиве T[] будет строка "21.33", в E[] будет "0", в B[] будет "73.0"

Если данные нужно будет обрабатывать переменные: Temperatura=21.33, Energy=0, Barrel=73

string.jpg

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В CVAVR не могу запустить программу вопрос-ответ через uart.

не получается  прерывание ISR,

#include <mega8.h>    
ISR (USART_RXC_vect) { int b;  b = UDR; 
  // Это подпрограмма обработки прерывания
Не работает функция ISR (USART_RXC_vect)  - выдает ошибку. чего-то требует .  

остальная часть программы - без ошибок. может какую-то библиотеку надо?

В папке CVAVR не нашел файла interrupt.h  Как делается прерывание по uart ?

Ссылка на комментарий
Поделиться на другие сайты

у меня получалось пересылать символы из МК в ПК и обратно из ПК в МК. там все нормально, без прерываний. а тут хочу получить ответ на посыл. и без прерывания не получается.   вот код программы

Скрытый текст

 

#include <mega8.h> 
#include <delay.h>    
// Не работает функция ISR (USART_RXC_vect)  т.к. нет библиотеки interrupt.h ?
ISR (USART_RXC_vect) { int b;            // Подпрограмма обработки прерывания
b = UDR;                                            // Выполняем обработку принятого байта
if (b=='1')   {                                         // Если приняли "1"
USART_Transmit('R');                           // Отправляем букву "R"
USART_Transmit(0x0d);                       // переход в начало строки
USART_Transmit(0x0a); }                    // переход на новую строку
else                                                   // Если нет
if (b=='2') {                                          // Если приняли "2"
USART_Transmit('L');                          // Отправляем букву "L"
USART_Transmit(0x0d);                      // переход в начало строки
USART_Transmit(0x0a); }  }                // переход на новую строку

void USART_Init( unsigned int ubrr) {   // Инициализация модуля USART
UBRRH = (unsigned char)(ubrr>>8);    // Задаем скорость работы USART 
UBRRL = (unsigned char)ubrr;
UCSRB=(1<<RXEN)|( 1<<TXEN);       // Разрешаем прием и передачу по USART 
UCSRB |= (1<<RXCIE);
UCSRC=0x86;                                                    // Инициализация именно для ATmega8
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); }
void USART_Transmit( unsigned char data ) {       // Функция отправки данных
while ( !(UCSRA & (1<<UDRE)) );                       // Ожидание опустошения буфера приема
UDR = data; }                                                    // Начало передачи данных                    

int main(void)  { USART_Init (8);     // главная программа
USART_Transmit('O');                   // Передаем при включении
USART_Transmit('k');                   // сообщение "Ok!", что свидетельствует
USART_Transmit('!');                   // о правильно работе программы
USART_Transmit(0x0d);             // переход в начало строки
USART_Transmit(0x0a);            // переход на новую строку
sei();                                      // разрешаем глобально прерывания
while(1) { )                             // вечный цикл.  тут пусто
 }   }      

 

чего не хватает?    вот говорит

Error:  function argument #1 of type 'flash unsigned char [10]' is incompatible with required parameter of type 'unsigned char []'
 

Изменено пользователем Igor-13
Ссылка на комментарий
Поделиться на другие сайты

18 часов назад, Igor-13 сказал:

ISR (USART_RXC_vect)

Это не для CVAvr, это для AVR-GCC. Это надо заменить на соответствующий обработчик прерывания, определенный по правилам CVavr, иначе не заработает.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

да, понял. спасибо.  Оказалось, надо делать так -

interrupt [USART_RXC]  void usart_rx_isr(void) {обработчик прерывания} 
А потом, в майне вставить

#asm("sei") // разрешаем глобально прерывания.

И все заработало, вопрос-ответ,  все норм.  Только не выводит "Ок!" почему-то. 

CVAvr версия 2.05.0

Изменено пользователем Igor-13
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...