2016-08-22 14 views
1

Я использую микроконтроллер для связи с модулем SIM808, и я хочу отправлять и принимать AT-команды.Получение AT-команд

Проблема прямо сейчас заключается в том, что для некоторых команд я получаю только некоторые части ответов, которые я должен получить, но для некоторых других я получаю то, что должен. Например, если я выключу модуль, я получу «НОРМАЛЬНУЮ ПИТАНИЕ», как и ожидалось.

Я считаю, что все получаю, я просто не способен это увидеть. Я получаю начало и конец ответа, поэтому проблема должна быть в том, как я разбираю и буферизую. Я использую прерывание RXC с буферизацией FIFO.

Например, для команды "AT + CBC" я должен получить что-то вроде:

" + CBC: 1,96,4175 OK "

Но я получаю «+ CBC1, 4130OK»

(я заменил нечитаемые символы с точкой)

bool USART_RXBufferData_Available(USART_data_t * usart_data) 
{ 
    /* Make copies to make sure that volatile access is specified. */ 
    uint8_t tempHead = usart_data->buffer.RX_Head; 
    uint8_t tempTail = usart_data->buffer.RX_Tail; 

    /* There are data left in the buffer unless Head and Tail are equal. */ 
    return (tempHead != tempTail); 
} 


uint8_t USART_receive_array (USART_data_t * usart_data, uint8_t * arraybuffer) 
{ 
    uint8_t i = 0; 
    while (USART_RXBufferData_Available(usart_data)) 
    { 
     arraybuffer[i] = USART_RXBuffer_GetByte(usart_data); 
     ++i; 
    } 

    return i; 
} 


void USART_send_array (USART_data_t * usart_data, uint8_t * arraybuffer, uint8_t buffersize) 
{ 
    uint8_t i = 0; 

    /* Wait until it is possible to put data into TX data register. 
    * NOTE: If TXDataRegister never becomes empty this will be a DEADLOCK. */ 
    while (i < buffersize) 
    { 
     bool byteToBuffer; 
     byteToBuffer = USART_TXBuffer_PutByte(usart_data, arraybuffer[i]); 
     if(byteToBuffer) 
     { 
      ++i; 
     } 
    } 
} 

void send_AT(char * command){ 

    uint8_t TXbuff_size = strlen((const char*)command); 

    USART_send_array(&expa_USART_data, (uint8_t *)command, TXbuff_size); 

    fprintf(PRINT_DEBUG, "Sent: %s\n\n", command); 

} 

void receive_AT(uint8_t *RXbuff){ 

    memset (RXbuff, 0, 100); 

    uint8_t bytes = 0; 

    bytes = USART_receive_array(&expa_USART_data, RXbuff); 

    int n; 
    if (bytes>0) 
    { 
     RXbuff[bytes]=0; 
     for (n=0;n<bytes;n++) 
     { 
      if (RXbuff[n]<32) 
      { 
       RXbuff[n]='.'; 
      } 
     } 
    } 

    fprintf(PRINT_DEBUG, "Received: %s\n\n", RXbuff); 

    } 

int main(){ 

unsigned char RXbuff[2000]; 

send_AT("ATE0\r\n"); 
receive_AT(RXbuff); 

send_AT("AT\r\n"); 
receive_AT(RXbuff); 

send_AT("AT+IPR=9600\r\n"); 
receive_AT(RXbuff); 

send_AT("AT+ECHARGE=1\r\n"); 
receive_AT(RXbuff); 

send_AT("AT+CBC\r\n"); 
_delay_ms(2000); 
receive_AT(RXbuff); 

send_AT("AT+CSQ\r\n"); 
_delay_ms(2000); 
receive_AT(RXbuff); 

} 
+0

Два замечания по самому вопросу: вы разместили «плавающий код», который не является частью какой-либо функции; и вы не показали, как определяется «RXbuff», или как его область относится к «плавающему коду», где он используется. –

+0

Я отредактировал код –

+0

"/ * В буфере остались данные, если Head и Tail не равны. * /" Но буфер (круговой) также может быть заполнен. По этой причине вам нужна третья переменная: количество байтов в буфере. Затем 'RX_Head' и' RX_Tail' используются приемником и сборщиком независимо, а количество байтов увеличивается и уменьшается на них. –

ответ

0

Таким образом, проблема не связана с этой частью кода. Я использую эмулированный последовательный порт для печати материала с микроконтроллера на ПК. Проблема заключалась в том, что скорость, с которой я печатал символ на ПК, была намного быстрее, чем то, что получал ПК, поэтому некоторые части не появлялись.

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

  • Нет связанных вопросов^_^