惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
M
MIT News - Artificial intelligence
G
Google Developers Blog
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
爱范儿
爱范儿
罗磊的独立博客
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
C
Check Point Blog
美团技术团队
宝玉的分享
宝玉的分享
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - bitwoods

Linux驱动开发:内核模块堆叠(1) Linux驱动开发:内核模块与普通应用的区别 Linux驱动开发:从一个最简单的模块开始 c++ prepareStatement使用like查询语句的方式 glog编译报错解决 阿里云Ubuntu服务器优化 linux c++程序使用MD5 蓝牙Mesh简介(一)设备标识:UUID和Mesh地址 MT7621 openWrt插件操作GPIO(mmap) adblock plus 您的地区不可用 OpenWRT 修改固件默认显示中文 OpenWRT:插件自启动 OpenWRT编译时修改时区与主机名 SC200L Android10启动和关机修改 ILI9881D驱动 ubuntu20.04 微信和迅雷安装包 开启power management功能有坑,ESP32串口频繁出现UART_BREAK中断 MAC地址与字符串的相互转化 ESP32音频开发板ESP32-Korvo V1.1踩坑
串口AT与数据的混杂接收处理
bitwoods · 2023-07-22 · via 博客园 - bitwoods

linux串口AT与数据的混杂接收处理;
fdcom_rs232为串口句柄
conf.rs232.baudrate为实际使用的波特率
buf_rs232 为串口数据缓存数组
buf_rs232_len 为串口数据缓存实际长度
LOG_ERROR 为自定义错误打印宏

void recv_at_rs232(void)
{
	char buf[1024];//根据实际需要分配大小
	int len = 0;

	if (fdcom_rs232 <= 0) {
		usleep(100 * 1000);
		return;
	}
	memset(buf, 0, sizeof(buf));
	len = PortRecv(fdcom_rs232, buf, sizeof(buf_rs232), conf.rs232.baudrate);

	if (len > 0) {
		memcpy(buf_rs232 + buf_rs232_len, buf, len);
		buf_rs232_len += len;
	}




	char *head = strstr(buf_rs232, "AT");
	char *end = strstr(buf_rs232, "\r\n");
	//开始分别取出AT和数据
	while(buf_rs232_len > 4 && head != NULL && end != NULL && (int)(end - head) > 2){
		char atbuf[128] = {0};//根据实际需要分配大小
		
		//检查AT之类之前是否有数据,有数据则将该部分数据取出发送
		int hd_len = (int)(head - buf_rs232);
		if(hd_len > 0){
			//do you want
			memcpy(data.rs232.data, buf_rs232, hd_len);


			memmove(buf_rs232, buf_rs232 + hd_len, buf_rs232_len - hd_len);
			buf_rs232_len -= hd_len;
		}
		//取出AT		
		int at_len = ((int)(end - head)) + 2;
		//防呆
		if(at_len > 128){
			LOG_ERROR("collect", __FILE__, __LINE__, "not right at!");
		}
		else{
			//do you want for at
			memcpy(at_buf, buf_rs232, at_len);

			
			memmove(buf_rs232, buf_rs232 + at_len, buf_rs232_len - at_len);
			buf_rs232_len -= at_len;
		}
		//防呆,防止AT指令后有多个0D0A
		while (buf_rs232_len >2 && buf_rs232[0] == '\r' && buf_rs232[1] == '\n')
		{
			memmove(buf_rs232, buf_rs232 + 2, buf_rs232_len - 2);
			buf_rs232_len -= 2;
		}
		head = strstr(buf_rs232, "AT");
		end = strstr(buf_rs232, "\r\n"); 		
	}
	//剩余部分为数据,直接发送
	if (buf_rs232_len > 0) {
		//do you want


		memset(buf_rs232, 0, sizeof(buf_rs232));
		buf_rs232_len = 0;
	}
}