c - 如何在字符串的开头和结尾识别来自 MC60 的每个响应的 CR 和 LF?
问题描述
一年多没有接触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 双方分开并将实际数据存储在数组中。
解决方案
建议在收到'\r'
or'\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);
}
推荐阅读
- kubernetes - 节点“k8smasterone”无效:[metadata.taints[0].key:无效值:“”
- r - 一种简单的方法来模拟具有指定平均值和范围的“调查数据”,或具有标准化均值差的两个整数样本
- java - 如何使用 java 8 流从列表中创建以自定义对象列表为值的地图?
- python - 以集群模式运行 Spark 应用程序不起作用
- google-cloud-platform - GCP中的Terraform`name`与`self_link`
- vis.js - vis-network - 将图像定位在节点旁边
- javascript - 模块导出后的node.js变量范围
- linux - Linux内核如何从epoll兴趣列表中移除一个已关闭的fd?
- pine-script - 松脚本,有没有办法动态设置
- opengl - 如何在 OpenGL 片段着色器中创建闪烁效果?