Stellaris Launchpad UART String ifade okuma yardım

Başlatan muhendisbey, 05 Kasım 2013, 19:00:10

muhendisbey

Elimde halihazırda çalışan bir kodum var. Var ama sadece harflerle çalışıyor, istiyorum ki string ifade ile çalışsın. Bunu nasıl yapabilirim?

Koda göre r kırmızı ledi yakar t söndürür, g yeşil ledi yakar h söndürür, b mavi ledi yakar n söndürür.
Şimdi yapmak istediğimize gelirsek:
"Blue" yazdığımda mavi led yanacak "bloff" yazdığımda sönecek. Böyle bir şeyi en kolay nasıl yazarım?
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"

#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

//*****************************************************************************
//
// The UART interrupt handler.
//
//*****************************************************************************
void
UARTIntHandler(void)
{
    unsigned long ulStatus;
		char  temp[1]; 
 
    ulStatus = UARTIntStatus(UART0_BASE, true);   
 
    temp[0] = UARTCharGet(UART0_BASE);
 // mavi
		if (temp[0] == 'b')
		{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
		}
 		
		if (temp[0] == 'n')
		{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
		}
	//kirmizi
		if (temp[0] == 'r')
		{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
		}
 		
		if (temp[0] == 't')
		{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);
		}
	//yesil
		if (temp[0] == 'g')
		{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);
		}
 		
		if (temp[0] == 'h')
		{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0);
		}
		
		
		UARTIntClear(UART0_BASE, ulStatus);		// seri port interrupt bayrağını temizler  

		
}

void
UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
    //
    // Loop while there are more characters to send.
    //
    while(ulCount--)
    {
        //
        // Write the next character to the UART.
        //
        
				UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);	
        
    
    }
}
int
main(void)
{
    

    //
    // Set the clocking to run directly from the crystal.
    //
		SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                       SYSCTL_XTAL_16MHZ);
	
    //
    // Enable the GPIO port that is used for the on-board LED.
    //
  
		SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    //
    // Enable the GPIO pins for the LED (PF2).  
    //
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
		GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);
		GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3);
    //
    // Enable the peripherals used by this example.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    //
    // Enable processor interrupts.
    //
    IntMasterEnable();

    //
    // Set GPIO A0 and A1 as UART pins.
    //
    GPIOPinConfigure(GPIO_PA0_U0RX);
    GPIOPinConfigure(GPIO_PA1_U0TX);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);


    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,
                            (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                             UART_CONFIG_PAR_NONE));

    //
    // Enable the UART interrupt.
    //
		
    IntEnable(INT_UART0);
    UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);


		// \033---> esc karakteri \r--->CR \n--->LF karakteri 
    UARTSend((unsigned char *)"Metin Girin:\r\n", 14);


    //
    // Loop forever echoing data through the UART.
    //
    while(1)
    {
    }
}
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

z

Karşıdan sıfır da dahil önceki karakterlerin gelmesini bekleyeceksin ve her bir kararkteri geldikçe bufferda biriktireceksin.

Son olarak 0'ı da aldığında string karşılaştırma işi yapılacak. Bunu ister byte byte sen karşılaştır istersen strcmp ile yap.

Karşıdan string yollayan rutini sen yazacaksan string sonundaki sıfırı da yollamak zorundasın. Yada, String boyunu ilk veri olarak yollarsın daha sonra da string karakterlerini peşi sıra yollarsın. Bu kısmı sana kalmış.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

JKramer

Switch-case ve bir durum değişkeniyle olabilir. Normaldeki durumda gelen karaktere bakarsınız; 'b' ise bir sonraki duruma geçersiniz, değilse o durumda kalmaya devam edersiniz. 'b' durumundayken gelen karakter 'l' ise bir sonraki durumda geçersiniz; değilse en baştaki duruma dönersiniz.

Bunun dışında ring buffer tarzı bir yapıyla gelen karakterleri bir diziye yazıp ana programda ilgili karakter sıralamasını kontrol edebilirsiniz.

muhendisbey

Alıntı yapılan: JKramer - 05 Kasım 2013, 19:22:00
Switch-case ve bir durum değişkeniyle olabilir. Normaldeki durumda gelen karaktere bakarsınız; 'b' ise bir sonraki duruma geçersiniz, değilse o durumda kalmaya devam edersiniz. 'b' durumundayken gelen karakter 'l' ise bir sonraki durumda geçersiniz; değilse en baştaki duruma dönersiniz.

Bunun dışında ring buffer tarzı bir yapıyla gelen karakterleri bir diziye yazıp ana programda ilgili karakter sıralamasını kontrol edebilirsiniz.
Hocam bunu yapmayı düşünmüştüm state machine şeklinde ancak daha kolayı vardır diye yapmadım. Çünkü komut sayısının çok daha fazla olduğunu düşünün stateler birbirine geçecek. Örneğin AT komut sistemi.
String okumak bela gibi.

Ring buffer olayı nasıl yapılır, mantıken yapısı anlaşıyor ancak nasıl yapıldığı konusunda fikrim yok.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

JKramer

Bu başlıkta gerbay'ın verdiği, vxWorks'un ring buffer kodu var. Bunu temel alıp uart kesmesiyle kullanmanız mümkün ama biraz zamanınızı alabilir. Zaten gelen karakterleri buffer'a atmayı otomatiğe bağladıktan sonra geriye buffer'da yeni karakter olup olmadığına bakıp değerlendirmek kalıyor.

muhendisbey

#5
ringbuffer dışında farklı bir yol yok anlaşılan.
Bilmediğim bir şey olabilir diye düşündüm.  Aslında receive a string diye birşey var ancak nasıl kullanacağımı anlayamadım karmaşık geldi

Stellaris uartstudio.c dosyası sığmıyor komutu vereyim:

UARTgets(char *pcBuf, unsigned long ulLen)

şeklinde bir komut oluşturulmuş
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.