一年多来,我没有碰过C,现在我必须做这个项目。 我正在编写用于通过AVR微控制器发送MC60 AT命令的代码,但是我刚刚完成了Uart的基本功能,可以将测试命令发送和读取命令到MC60,现在只是在Proteus的虚拟终端上进行测试,以了解如何接收命令。在每条命令的末尾,我都直接通过UART使用其十六进制代码发送CR和LF,直到现在还可以,但是当我必须从MC60接收响应时,它们的开头和结尾也都有CR和LF,而我代码不能够从命令中提取出实际的响应数据。我只希望将实际的响应数据存储在可以从函数返回的字符串中。以下是我的获取响应的代码示例:
unsigned char uart_RX()
{
while(!UCSRA & (1<<RXC));
return UDR;
}
void response(char *rec) //function to fetch the response in string format
{
char x;
do
{
x = uart_RX();
*rec = x;
rec++;
}
while(x!=NULL);
return;
//_delay_ms(10);
}
void main()
{
char buf[200];
char resp[200];
char cr, lf;
uart_init(12);
_delay_ms(1000);
send_readcmd(READNAVINFO); //function that sends "<CR><LF>AT+QGNSSRD?<CR><LF>" command through my own defined library of AT commands
while(1)
{
cr = uart_RX();
if (cr==0x0D)
{
lf = uart_RX();
if (lf==0x0A)
{
response(buf);
snprintf(resp, sizeof(buf), buf); //I feel resp will store the buf data without CR and LF
}
}
}
}
我希望使用send_readcmd()发送读取命令后,来自MC60的实际响应数据将存储在resp char数组中。目前,它正在识别我感觉到的命令,但是响应是一团糟,我无法正确解析该响应。 请有人帮助我,指导我如何获取响应,以及将实际响应数据与CR和LF双方分开,并将实际数据存储在数组中。
答案 0 :(得分:0)
建议在收到'\r'
或'\n'
和且没有事先输入的情况下,建议悄悄地丢弃该数据并寻找更多信息。
收到预先输入的'\r'
或 '\n'
时,将其标识为命令结束。
// I'd also expect some timeout criteria, yet that is TBD code
void response(char *rec, size_t size) {
char ch;
while ((ch = uart_RX()) == '\r' || ch == '\n') {
;
}
do {
if (size > 1) {
size--;
*rec++ = ch;
}
ch = uart_RX();
} while (ch != '\r' && ch != '\n');
if (size > 0) {
*rec = '\0';
}
}
用法
while (1) {
response(buf, sizeof buf);
printf("%s", buf);
}