C

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

9 сообщений в этой теме

Всем привет. 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 

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

0

Поделиться сообщением


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

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

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В ‎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

1

Поделиться сообщением


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

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

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

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

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

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

0

Поделиться сообщением


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

Откуда же нам знать. Может вы их не разрешили глобально и/или конкретно для rx.

0

Поделиться сообщением


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

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

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

 

#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
0

Поделиться сообщением


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

Какая версия компилятора?

Изменено пользователем солар
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
18 часов назад, Igor-13 сказал:

ISR (USART_RXC_vect)

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

0

Поделиться сообщением


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

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

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

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

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

CVAvr версия 2.05.0

Изменено пользователем Igor-13
0

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

  • Сообщения

  • Похожие публикации

    • Автор: Mixxxxa
      Здравствуйте. Необходимо получать данные с Bluetooth модуля HC-06 и ESP8266 (ESP-01 версия) на Arduino Nano.
      Подключил по схеме:

      В итоге: передача работает только если подключено только одно передающее устройство. Если подключены оба одновременно, то на ардуино приходит мусор или вообще ничего. 
      Можно-ли решить проблему установкой диодов у выходов ESP и HC-06? Если да, то какие подойдут? Если нет, то какие еще есть варианты решения?
       
    • Автор: tagir000
      Имею проводной сканер штрих кодов Argox AS-8000 rs232, хочу переделать его в беспроводной с помощью модулей HC-05 и HC-06. Если я не ошибаюсь, то достаточно разрезать провод сканера пополам, найти линии Rx и Tx и к ним подпаять модули, которые будут работать в сквозном режиме, передавая по блутуз дальше, то что приходит к ним по линии Tx. Помогите мне пожалуйста, в этом деле новичок я. Сами модули я уже настроил: master-модуль сам соединяется со slave-модулем.
    • Автор: VisualNT
      Доброго времени суток!
      Может кто-нибудь объяснить, в чём смысл и преимущества использования специализированных программаторов для STM32 типа ST-Link и клонов, работающих по интерфейсам SWD/JTAG, если записать флеш можно прямо по UART/ISP или быстрее по USB (при его наличии)?
      Я так понимаю, что программаторы, кроме записи в память, ещё умеют выполнять отладку - и это их единственное отличие.
      А если отладка не нужна? Вернее, часто ли она используется при написании каких-нибудь маленьких прикладных программ типа реле времени? Я собираюсь развести свою печатную плату для STM32F107, а потом хочется поэкспериментировать с STM32F407ZGT - в них в обоих есть USB интерфейс, они оба есть в списке поддерживаемых USB DFU (согласно AN 3156). Но на форуме я прочитал, что пока все сидят на дискавери, в основном из-за того, что в ней есть встроенный программатор ST-LINK прямо на плате, но почему его наличие так важно и не заменяется возможностью программирования по UART/ISP или по USB? Есть ли какое-либо отличие кроме возможности отладки? Может быть, как и в случае со фьюзами у AVR, у STM32 есть какие-то функции/настройки, которые можно использовать/изменять только программатором ST-LINK?
      И да, разве скорость программирования по USB будет существенно ниже, чем по тому же JTAG или SWD?
      Заранее спасибо за ответы! Заранее предупрежу, чот с микроконтроллерами я раньше работал, но вот от ST что-то более-менее делал только на STM32F030...
    • 4
      Автор: Гость Maxim
      Доброго времени суток.
      Я скачал проэкт (http://alex-exe.ru/radio/avr/avr-uart/), который работает на Proteus, но не работает в реальности. Использую Terminal, atmega16, PL-2303HX. Подсоединяю RXD (переходник) с TXD (микроконтроллер) и наоборот.
      Подскажите, что я не так делаю и как правильно надо подсоединять микроконтроллер с компьютером?
    • 8
      Автор: Гость Твой друг
      Вопрос. Почему не выполняется на atmega328 команды? Тестировал в протеусе на частоте 8 мгц (в настройках проекта 20 мгц, но думаю на это не так сильно должно влиять).
      На микроконтроллере запущен аппаратный таймер - работает нормально. Через юарт (настроен только TXD) всё время шлёт: 011111111101111111110... Но сам код не хочет выполняться:
      while (1) { delay_ms(0.4); // выполнилось при первом цикле PORTD.6=1; // выполнилось при первом цикле delay_ms(0.4); // выполнилось при первом цикле putchar(PORTC.0+PORTC.1*2); // заморозилось и далее не выполняется, но аппаратный таймер работает, юарт флудит (011111111101111111110...) // функцию putchar нашёл в интернете PORTD.6=0; } PORTD.6 - настроен на выход
      PORTC.0 и PORTC.1 настроены на вход. Включены подтягивающие резисторы.
      P.S. Проект сделан в CodeVisionAVR с использованием генератора кода.