Вопрос по USART.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Вопрос по USART.

Сообщение TmYAG »

Здравствуйте!
Появился вопросик по USART. Ну скорее не по самому USART...
В общем не могу понять как реализовать прием строки, для дальнейшей ее обработки. Вроде лопатил указатели, но все равно никак не могу допереть.

Код: Выделить всё

#include "usart.h"

/*############USART initialize############*/	
void Usart_Init(){
	//Clocking USART port
	RCC->AHB1ENR = RCC_AHB1ENR_GPIOBEN;
	RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
	
	GPIOB->MODER &=~ GPIO_MODER_MODER6 | GPIO_MODER_MODER7; 
	GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;
	GPIOB->AFR[0] |= 0x77000000;
	GPIOB->OTYPER = 0;
	
	//Configure USART
	USART1->BRR |= 0x341;//19200                  
  USART1->CR2 = 0;                    
  USART1->CR3 = 0;

	//Enable working
	USART1->CR1 |= USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;//Enable USART1|Enable receive|Enable transmit
	NVIC_EnableIRQ (USART1_IRQn);                       	//Enable USART interrupts
  //USART1->CR1  |= USART_CR1_TCIE;                     	Enable transmit comlete interrupts
  USART1->CR1  |= USART_CR1_RXNEIE;    									//Enable receive interupts
	
}
/*########################################*/


/*############Write to console############*/
//Write data to cosole;
void Usart_Transmit(uint8_t Data){
	while(!(USART1->SR & USART_SR_TC)){};
  USART1->DR = Data;
}
//Write String to console;
void Usart_Str(const char * data){
	char c;
	while((c=*data ++)){ 
		Usart_Transmit (c);
	}
}
/*########################################*/


/*############Read char from console############*/
char Usart_Read_Ch(){
		 char t = (char)USART1->DR;		 
		 return t;
}
/*##############################################*/

/*############Read string from console############*/
void Usart_Read_Str(){
		 char buff[16];
		 buff[i] = Usart_Read_Ch();
		 if(buff[i] != '\r') {			
			Usart_Transmit(buff[i]);
			i++;
		 } 
		 else {
			Usart_Str("\n \r");
		 }
/*тут по идее я должен возвращать указатель char * str, тогда и функция должна быть char* Usart_Read_Str
Ну и еще вроде как я понимаю, что я должен в цикле по длине буфера написать str[i] = buffer[i], и после цикла написать return str;
???
*/
} 
/*################################################*/


void USART1_IRQHandler(){
	if(USART1->SR & USART_SR_RXNE)
	{
		Usart_Read_Str();
	}	
}
Заодно может, посмотрите проект, подскажите по моему говнокоду в целом))))
Вложения
Usart_menu.rar
(507.61 КБ) 157 скачиваний
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Вопрос по USART.

Сообщение oleg110592 »

может поможет - делал для F0:

Код: Выделить всё

void USART1_IRQHandler(void)
{
    if((USART1->ISR & USART_ISR_RXNE) == USART_ISR_RXNE)
    {
        chartoreceive[indexchar] = (uint8_t)(USART1->RDR); /* Receive data, clear flag */
        if(chartoreceive[indexchar] == 0x0D)
        {
            indexchar = 0;
            flags |= RECEIVE_READY;
            return;
        }
        indexchar++;
        if(indexchar > sizeof(chartoreceive))
        {
            indexchar = 0;
       }            
    }
}
в основном цикле проверяем флаг, если взведен - строка в буфере
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: Вопрос по USART.

Сообщение TmYAG »

oleg110592 писал(а):может поможет - делал для F0:
Мне не совсем понятно как сделать, чтобы то, что я отправил на дискавери по юарту через терминал, записалось в какую-то переменную?

Код: Выделить всё

char* Usart_Read_Str(char * str){
		 char buff[16];
		 buff[i] = Usart_Read_Ch();
		 if(buff[i] != '\r') {			
			Usart_Transmit(buff[i]);
			str[i] = buff[i];
			i++;
		 } 
		 else {
			Usart_Str("\n \r");
			 return str;
		 }
		 
}
что-то вроде этого.

допустим я хочу спросить имя пользователя и ввожу его с клавиатуры. Дискавери считывает это хозяйство побайтно и пишет в некий буфер. buff. Как мне сделать эту переменную доступной для обработки? Чтобы можно было написать, например

Код: Выделить всё

Usart_Transmit_Str("Hello ");
Usart_Transmit_Str(buff)
и получить: Hello Vasily
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопрос по USART.

Сообщение Аlex »

TmYAG писал(а):Как мне сделать эту переменную доступной для обработки?
О какой переменной идёт речь ? О буфере чтоли ? Буфер - это не переменная, это массив.
Вопрос совсем не понятен. Если он (буфер) уже существует, значит и доступ к нему уже есть. В него даже что-то записывается.
Вы как-то размыто описываете проблему.
Реклама
Эиком - электронные компоненты и радиодетали
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: Вопрос по USART.

Сообщение TmYAG »

Аlex писал(а):О какой переменной идёт речь ? О буфере чтоли ?
В буфер у меня пишется все что угодно. Я хочу сделать так чтобы МК запросил имя, я ввел имя и оно записалось в массив name, запросил возраст, я ввел возраст и он записался в другую переменную. и т.д.
В идеале, хочу, чтобы МК распознавал команды в виде: !имя [name] и т.д.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Вопрос по USART.

Сообщение oleg110592 »

TmYAG писал(а):В идеале, хочу, чтобы МК распознавал команды
Это? The string.h include file contains prototypes for the following string and buffer manipulation routines.
функция strcmp: compares the contents of string1 and string2 and returns a value indicating their relationship.

Код: Выделить всё

#include <string.h>
#include <stdio.h> /* for printf */

void tst_strcmp (void) {

  unsigned char buf1 [] = "Bill Smith";
  unsigned char buf2 [] = "Bill Smithy";
  int i;

  i = strcmp (buf1, buf2);

  if (i < 0)
    printf ("buf1 < buf2\n");
  else if (i > 0)
    printf ("buf1 > buf2\n");
  else
    printf ("buf1 == buf2\n");
}
http://www.keil.com/support/man/docs/ca/ca_strcmp.htm
Реклама
golf2109
Родился
Сообщения: 2
Зарегистрирован: Сб янв 19, 2013 04:07:25
Откуда: Kiev

Re: Вопрос по USART.

Сообщение golf2109 »

Ответить

Вернуться в «ARM»