Bunalmis hocamın yazdığı uart3 modülünü kullanarak Rs232 bluetooth modülü bağladım. Ve bluetooth modülünü telefonla eşleştirdim. Stm32 den telefona veri göndere biliyorum ve gelen veriyi okuyabiliyorum. Telefondan Stm32f4 e yolldığım veriyi nasıl kontrol ediceğimi bulamadım. Örneğin "FF" verisi geldiğinde D 12 deki led yansın gibi . if komutunun programınını yazamadım. gelen veriyi nasıl if de kontrol edebilirim
Bu konu hakkında bilgisi olan kimse yok mu?
En basit haliyle şöyle:
if(RxBuf[0] == 'A'){
WAdr = 0;
RxBuf[WAdr]=0;
PD->ODR.pin.p13 =!PD->ODR.pin.p13;
}
Hocam verdiğin kodu ekledim ama veri gönderiyorum ama veri yolladığımda hiç bişi olmuyor. Koddamı bir yanlışlık var
#include "STM32F4xx.h"
unsigned char WAdr,RAdr;
char RxBuf[128];
/*********************************************************************************
CPU frekansi 168Mhz
AHB frekansi 84 Mhz
APB frekansi 42 Mhz
*********************************************************************************/
void SystemInit()
{
unsigned int i;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x07402A04; // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim 168 Mhz
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
RCC->AHB1ENR |= 0x0000001F; // GPIO A,B,C,D,E clock'u aktif edelim
GPIOD->MODER = 0x55550000; // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
GPIOD->OSPEEDR= 0xFFFFFFFF; // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}
/*********************************************************************************
USART3 modulunu kullanarak asenkron haberlesme (Hata kontrolu yapilmiyor)
*********************************************************************************/
void USART3_IRQHandler()
{
volatile int Sts;
Sts=USART3->SR;
RxBuf[WAdr]=USART3->DR;
WAdr=(WAdr+1)&0x7F;
}
void UsartInit()
{
WAdr=0;RAdr=0;
// USART3 MODULUNU AKTIF HALE GETIRELIM
RCC->APB1ENR|=0x00040000; // USART3 Clk Enable (Rehber Sayfa 113)
RCC->APB1RSTR|=0x00040000; // USART3 Resetlendi
GPIOB->AFR[1]=0x07777700; // PB10..PB14 pinleri USART3 ile alakalandirildi (Hard Sayfa 49)
GPIOB->MODER|=0x2AA00000; // GPIOB 10..14 icin alternatif fonksiyon tanimi (Rehber Sayfa 148)
// USART3 MODULUNU AYARLAYALIM // 1 Start, 8 Data, 1 Stop, No parity (Default degerler)
RCC->APB1RSTR&=~0x00040000; // USART3 Reseti kaldiralim
// USART3->SR&=~0X03FF; // Status registeri silelim
USART3->BRR=0X1112; // 9600 Baud
USART3->CR1|=0x0000202C; // USART3 enable
NVIC->ISER[1]|=0x80; // NVIC da USART3 interrupta izin verelim
}
void SendChar(char Tx)
{
while(!(USART3->SR&0x80)); // TX Buffer dolu ise bekle (Rehber Sayfa 646)
USART3->DR=Tx;
}
void SendTxt(char *Adr)
{
while(*Adr)
{
SendChar(*Adr);
Adr++;
}
}
char DataReady()
{
return(WAdr-RAdr);
}
char ReadChar()
{
char Dat;
Dat=RxBuf[RAdr];
RAdr=(RAdr+1)&0x7F;
return(Dat);
}
// Rx ve TX pinlerini (GPIOB10 ve GPIOB11) birbirine baglarsaniz gonderdiginiz datalar geri gelecektir
int main()
{
int i;
UsartInit();
SendTxt("PicProje");
SendChar(' ');
SendTxt("Bunalmis");
for(i=0;i<0x1000000;i++); // Laf olsun diye bekledik
while(DataReady()) ReadChar();
while(1);
{
if(RxBuf[0] == 'A'){
WAdr = 0;
RxBuf[WAdr]=0;
GPIOD->ODR= 0x0000F000;
for(i=0;i<0x1000000000;i++);
}
else GPIOD->ODR= 0x00000000;
}
}
while(1);
1- döngü bu saturda kalır senin satırlara sıtr hiç gelmez. ';' kaldır.
2- 'A' karakterinden başka hiç bir veri gönderme. başka bir veri gelirse WAdr değerini sıfırlayamayız.
Saol hocam kaç gündür bunu yapmak için uğraştım. Sonunda başardım. ";" gözümden kaç mış çok saol.
Hocam A dan başka birşey geldiğinde etkilenmesin diye . İf in dışında while döngüsünde sürekli WAdr ve RAdr yi sürekli 0 sıfırlıyor. Ve başka karakter göndersemde etkilenmiyor.
while(1)
{
if(RxBuf[0] == 'A'){
GPIOD->ODR= 0x0000F000;
for(i=0;i<0x1000000;i++);
}
else GPIOD->ODR= 0x00000000;
WAdr=0; RAdr=0;
RxBuf[WAdr]=0;
}
}