2015-12-16 23 views
2

我尋求幫助,以從緩衝接收SMS,項目的一部分(返回字符和sizeof出的功能)

void UART_rx(void) 
    { 
    char rx_buffer[256]; 
    memset(rx_buffer,'\0',256); 
    int rx_length = read(uart_filestream, (void*)rx_buffer, sizeof(rx_buffer)); 
    if(rx_length < 0){ 
     printf("uart rx error\n"); 
    } 
    printf("RX: %s", rx_buffer); 
     } 

This這個功能內容和長度返回是我試圖修改代碼

int8_t SIM300WaitForMsg(uint8_t *id) 
{ 
    //Wait for a unsolicited response for 250ms 
    uint8_t len=SIM300WaitForResponse(250); 

    if(len==0) 
     return SIM300_TIMEOUT; 

    sim300_buffer[len-1]='\0'; 

    //Check if the response is +CMTI (Incoming msg indicator) 
    if(strncasecmp(sim300_buffer+2,"+CMTI:",6)==0) 
    { 
     char str_id[4]; 

     char *start; 

     start=strchr(sim300_buffer,','); 
     start++; 

     strcpy(str_id,start); 

     *id=atoi(str_id); 

     return SIM300_OK; 
    } 
    else 
     return SIM300_FAIL; 
} 

回答

1

使用參數,像這樣

void UART_rx(char *rx_buffer, ssize_t *rx_length) 
{ 
    memset(rx_buffer, '\0', rx_length); 
    *rx_length = read(uart_filestream, (void *) rx_buffer, *rx_length); 
    if (*rx_length < 0) 
     printf("uart rx error\n"); 
    printf("RX: %s", rx_buffer); 
} 

,並調用它像這樣

char rx_buffer[256]; 
ssize_t rx_length; 

rx_length = sizeof(buffer); 
UART_rx(rx_buffer, &rx_length); 

它在主叫funcion分配的空間,還要注意如何rx_length在兩個方面是有用的,讓UART_rx()知道目的地緩衝區的長度,並存儲讀取數據的長度很重要。

而且,你不應該需要memset()什麼,如果你必須這樣做,表示你的代碼中的錯誤,其實這是你的函數應該怎麼寫

void UART_rx(char *rx_buffer, ssize_t *rx_length) 
{ 
    *rx_length = read(uart_filestream, (void *) rx_buffer, *rx_length - 1); 
    if (*rx_length < 0) 
     printf("uart rx error\n"); 
    rx_buffer[*rx_length] = '\0'; 
    printf("RX: %s", rx_buffer); 
} 

最後,這uart_filestream是一個全局變量也可以被認爲是一個不好的跡象。最好使用UART_rx()的另一個參數,那將是uart_filestream,這樣函數將會更有用,整個代碼將更加健壯。