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

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: Дмитрий Кузьмичёв
      Доброго времени суток!!! Я столкнулся с тем, что не работает UART и не реагирует на AT-команды. Пробовал с 2-мя переходниками: CH340 и FT232RL, тот, что в Arduino. Пробовал и менять контакты RX-TX местами, и скорость менял (должно быть 9600 бод) - терминал молчит от слова совсем. CH340 просто светит своим индикатором приема, а FT232 моргнет при включении и все. Должно выводиться в терминале при включении ON, но не выводится ничего и никак не реагирует. Проверял и обвязкой, и упрощенным подключением (4 провода - 2 питания и 2 UART), и напряжение то 3.3 делал, то 3.7, то питал с аккумулятора - молчание. Подумал, что UART нагнулся из-за моих кривых рук - махнулся с другом на свежую, проверить UART, но результат тот же, полагаю, что в моем даже и не сдох. А сам модуль работает, не считая злосчатного UART. Так в чем может быть проблема? 
    • Автор: X-Fear
      Здравствуйте, на днях собрал ubs-usart на attiny2313 на макетной плате, всё работало. Припаял к плате - не работает. В диспетчере задач показывается, как Неизвестное устройство.  В чём может быть проблема, контакты проверил тестером в режиме прозвонки, вроде не коротит ничего. 




    • Автор: carlogulliani
      Добрый день, читаю датчик GPS MTK3339 по uart, везде, где бы не читал (ардуино, fdti, ubuntu) выдает следующее
       
      $GPGGA,061527.084,,,,,0,0,,,M,,M,,*43 $GPRMC,061527.084,V,,,,,0.00,0.00,110417,,,N*44 $GPGGA,061528.084,,,,,0,0,,,M,,M,,*4C $GPRMC,061528.084,V,,,,,0.00,0.00,110417,,,N*4B Из этого видно, что дату и время показывает верную, а координаты и позицию 0. Формат NMEA, также пробовал парить и с помощью ардуино и online парсеров, что подтвердило выводы. Тесты проводились в комнате, вот хочу понять, это до спутника не добивается или прошивка/модуль косячные?
       
      Может кто имел дело с данным модулем?
       
      По питанию все ок, подключил согласно даташиту платы (+5В там стоит преобразователь 5В в 3.3В)
       
      В поле еще не проверял
    • Автор: 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-модулем.