Я использую микроконтроллер для связи с модулем 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);
}
Два замечания по самому вопросу: вы разместили «плавающий код», который не является частью какой-либо функции; и вы не показали, как определяется «RXbuff», или как его область относится к «плавающему коду», где он используется. –
Я отредактировал код –
"/ * В буфере остались данные, если Head и Tail не равны. * /" Но буфер (круговой) также может быть заполнен. По этой причине вам нужна третья переменная: количество байтов в буфере. Затем 'RX_Head' и' RX_Tail' используются приемником и сборщиком независимо, а количество байтов увеличивается и уменьшается на них. –