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

推荐订阅源

A
About on SuperTechFans
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
宝玉的分享
宝玉的分享
美团技术团队
量子位
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
爱范儿
爱范儿
J
Java Code Geeks
博客园 - Franky
Last Week in AI
Last Week in AI
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
GbyAI
GbyAI
Recent Announcements
Recent Announcements
小众软件
小众软件
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog

博客园 - 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;
	}
}