STM32F4 USART Karakter Sorunu

Başlatan yagizhanyakali, 08 Kasım 2016, 14:52:08

yagizhanyakali

Öncelikle Merhabalar;

#include "stm32f4xx.h"                  // Device header
#include "stm32f4xx_usart.h"            // Keil::Device:StdPeriph Drivers:USART
#include <stdio.h>
#define Max_Strlen 24
volatile char alinanString[Max_Strlen+1];
static uint32_t sayici=0;
char cikti[50];

void Init_USART1(uint32_t baudrate)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);
	
	USART_InitStructure.USART_BaudRate = baudrate;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	
	
	USART_Cmd(USART1, ENABLE);
}

void USART_puts(USART_TypeDef* USARTx, volatile char *s)
{

	while(*s)
	{
		while( !(USARTx->SR & 0x00000040) ); 
		USART_SendData(USARTx, *s);
		*s++;
	}
}

int main()
{
	Init_USART1(9600);
	USART_puts(USART1, "Ayarlar Tamamlandi!\r\n");
	
	while(1);
}

void USART1_IRQHandler()
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE))
	{
		char kelime= USART1 -> DR;
		
		if( (kelime != '\n') && (sayici < Max_Strlen) )
		{
			alinanString[sayici]=kelime;
			sayici++;
		}
		else
		{
			sayici=0;
			USART_puts(USART1,alinanString);
		}
	}
}


Bilgisayardan USART ile cihaza veri gönderip seri haberleşme ekranında bu veriyi tekrar görmek istiyorum. Örneğin Merhaba yazdığımda ekranda yeniden merhaba yazmasını istiyorum. Çoğunluklada başardım fakat bir sorun var. Örneğin merhaba yazıyorum bana geriye merhaba döndürüyor fakat ikinici seferde merhabadan daha kısa bir kelime yazdığımda örneğin naber şu şekilde çıktı alıyorum ; naberaba.

Yardımcı olursanız sevinirim. Şimdiden teşekkür ederim...

Cemre.

Kesme geldiğinde dizileri temizleyen bir for döngüsü kurarak cozebilirsiniz sanırım.

JOKERAS

#2
Sizin Usart İnterrupt rutininde hata var sanırım.
Aldığınız Karakter dizisinin sonuna '\0' karakteri eklemeniz gerekiyor.

" " içerisine yazılan karakterlerin sonuna otomatik olarak '\0' NULL karakteri eklenir.
Puts Fonsiyonu (*str) Null Karakteri görene kadar işlem yapar.

Ama sizin Usart İnterruptınız da yani dataları aldığınız Kesme Rutininde böyle bir ifade yok.

else  {
     
        alinanString[sayici] = '\0' ;
        USART_puts(USART1,alinanString);
        sayici=0;
   }

Else Bloğunu yukarıdaki gibi deneyin.



yagizhanyakali

Alıntı yapılan: JOKERAS - 08 Kasım 2016, 16:41:57
Sizin Usart İnterrupt rutininde hata var sanırım.
Aldığınız Karakter dizisinin sonuna '\0' karakteri eklemeniz gerekiyor.

" " içerisine yazılan karakterlerin sonuna otomatik olarak '\0' NULL karakteri eklenir.
Puts Fonsiyonu (*str) Null Karakteri görene kadar işlem yapar.

Ama sizin Usart İnterruptınız da yani dataları aldığınız Kesme Rutininde böyle bir ifade yok.

else  {
     
        alinanString[sayici] = '\0' ;
        USART_puts(USART1,alinanString);
        sayici=0;
   }

Else Bloğunu yukarıdaki gibi deneyin.

Çok teşekkür ederim mesajlarınız için. Yazdığın kodu ekledim ve sorunum çözüldü. Bende sıfırlamam gerektiğini farkettim fakat nasıl sıfırlayacağımı çözememiştim.

Teşekkür ederim.

JOKERAS