2013-10-30 23 views
0

USART嵌入式c for atmega328p。試圖在收到某個字符後(在我的例子中是char $)存儲一個由任何用戶輸入的10個字符組成的數組。這爲我編譯,但只有在使用hercules實用程序讀取器輸入一串字符時纔會輸出美元符號。任何幫助讚賞USART嵌入式觸發字符存儲陣列

下面是代碼的副本我使用

#define FOSC 16000000 // Clock Speed 
#define BAUD 9600 
#define MYUBRR FOSC/16/BAUD-1 

#include <avr/io.h> 
//#include <stdio.h> 

char trig='$'; 
char arr[10]; 

//This function is used to initialize the USART 
//at a given UBRR value 
void USARTInit(unsigned int ubrr) 
{ 
    //Set Baud rate 
    UBRR0H = (ubrr>>8); 
    UBRR0L = ubrr; 

    //Enable The receiver and transmitter 
    UCSR0B = (1<<RXEN0)|(1<<TXEN0); 
    // Set fram format: 8data 2stopBit 
    UCSR0C = (1<<USBS0)|(3<<UCSZ00); 
} 

//This function is used to read the available data 
//from USART. This function will wait untill data is 
//available. 
unsigned char USARTReadChar(void) 
{ 
    //Wait untill a data is available 

    while(!(UCSR0A & (1<<RXC0))) 
    { 
     //Do nothing 
    } 

    //Now USART has got data from host 
    //and is available is buffer 

    return UDR0; 
} 

//This function writes the given "data" to 
//the USART which then transmit it via TX line 
void USARTWriteChar(unsigned char data) 
{ 
    //Wait untill the transmitter is ready 

    while(!(UCSR0A & (1<<UDRE0))) 
    { 
     //Do nothing 
     PORTD ^= 1 << PINB2; 
    } 

    //Now write the data to USART buffer 

    UDR0 = data; 
} 

int main(void) 
{ 
    DDRB |= 1 << PINB2; 

    //Varriable Declaration 
    char data; 

    USARTInit(MYUBRR); 

    //Loop forever 

    while(1) 
    { 
     //Read data 
     data = USARTReadChar(); 
     int i =0; 

     //if incoming data is a dollar sign(trig), 
     if(data==trig) 
     { 
      //start a loop to collect data from buffer 
      for(i=0;i<10;i++) 
      { 
       //array has 10 elements, will fill up the ith element as per for loop 
       arr[i]=data; 
       // printf("arrayoutput %c\n",arr[i]); 
       USARTWriteChar(data); 
      } 
     } 
    } 
} 

我編輯while循環由奧列格的建議,但仍無法得到它的返回數組.the整個代碼如下:

#define FOSC 16000000 // Clock Speed 
#define BAUD 9600 
#define MYUBRR FOSC/16/BAUD-1 
#include <avr/io.h> 
#include <stdio.h> 

char trig='$'; 
char arr[10]; 
//This function is used to initialize the USART 
//at a given UBRR value 
void USARTInit(unsigned int ubrr) 
{ 
    //Set Baud rate 

    UBRR0H = (ubrr>>8); 
    UBRR0L = ubrr; 

    //Enable The receiver and transmitter 
    UCSR0B = (1<<RXEN0)|(1<<TXEN0); 
    // Set fram format: 8data 2stopBit 
    UCSR0C = (1<<USBS0)|(3<<UCSZ00); 
} 

//This function is used to read the available data 
//from USART. This function will wait untill data is 
//available. 
unsigned char USARTReadChar(void) 
{ 
    //Wait untill a data is available 

    while(!(UCSR0A & (1<<RXC0))) 
    { 
     //Do nothing 
    } 

    //Now USART has got data from host 
    //and is available is buffer 

    return UDR0; 
} 


//This function writes the given "data" to 
//the USART which then transmit it via TX line 
void USARTWriteChar(unsigned char data) 
{ 
    //Wait untill the transmitter is ready 

    while(!(UCSR0A & (1<<UDRE0))) 
    { 
     //Do nothing 
      PORTD ^= 1 << PINB2; 

    } 

    //Now write the data to USART buffer 

    UDR0 = data; 
} 

int main(void) 
{ 
DDRB |= 1 << PINB2; 

    //Varriable Declaration 
    char data; 

    USARTInit(MYUBRR); 

    //Loop forever 

     //Read data 

     char input[10]; 
     while(1){ 
      data = USARTReadChar(); 
      if(data == trig){ 
       for(int i = 0; i < 10; i++){ 
        //here we're saving 10 characters to input array 
        input[i] = USARTReadChar(); 
        USARTWriteChar(input[i]);//tested without this also 
       } 
      } 
     } 
} 
+1

如果你想在for循環的$之後輸入其餘的數據,那麼你當然需要在那個循環中調用USARTReadChar()。 –

+0

您的阻止寫入可能會導致您錯過傳入的字符,儘管我期望得到某種不穩定的行爲。另外,您確定要配置** 2個停止位嗎?** –

+0

我使用了2個停止位,因爲它是來自數據表中設置示例的設置。代碼工作正常時,我只是有while循環傳回的確切字符收到。但無法設置陣列部分。我需要這樣做,最終與四個常量數組進行比較,如果它們相等,則會觸發輸出到端口。 (1) {//讀取數據 data = USARTReadChar(); (數據); USARTWriteChar(data); USARTWriteChar(data); } – user2936555

回答

1

嘗試在for()循環讀取字符:

char input[10]; 
while(1){ 
    data = USARTReadChar(); 
    if(data == trig){ 
     for(int i = 0; i < 10; i++){ 
      //here we're saving 10 characters to input array 
      input[i] = USARTReadChar(); 
     } 
     /* UPD: write stored array to console */ 
     for(int i =0; i < 10; i++){ 
      USARTWriteChar(input[i]); 
     } 
     /* those symbols are needed to emulate Enter button */ 
     USARTWriteChar('\r'); 
     USARTWriteChar('\n'); 
    } 
} 

UPD:此代碼母鹿正是你問的。它在內存中存儲10個字符。要將它們返回到控制檯(實用程序讀取器),您必須使用USARTWriteChar()。

+0

沒有似乎沒有工作,改變了上述代碼的while循環,但沒有得到實用程序讀取器的任何返回值。嘗試放入USARTWriteChar(輸入[i]);看看這是否會給出數組的值,但不會返回 – user2936555

+0

使用當前正在測試的* exact *代碼更新您的問題。上面顯示的 –

+0

更新 – user2936555