2015-12-16 1 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); 

Это очень важно, чтобы выделить пространство в несильно вызывающем абоненте, а также обратите внимание, как 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, таким образом функция будет более полезной, и весь код будет более надежным.

Смежные вопросы