[发送AT指令配置a7670C模块上网]

news2024/7/6 19:15:40

发送AT指令配置a7670C模块上网

  • 内核配置
  • 调试验证
  • 应用的编写
  • AT的指令的使用

内核配置

概要:基于rv1126平台调试SIMCOM 7670C 4G模块。
1,内核配置及内核代码修改
1.1按照芯片data sheet修改kernel代码,添加PID和VID。
此处根据不同的芯片按照其datasheet进行修改。
在这里插入图片描述
1.2 内核配置修改
1.2.1 打开USB gadget的RNDIS功能
在这里插入图片描述
1.2.2使能 USB 串口 GSM、CDMA 驱动
在这里插入图片描述
1.2.3,使能USB network,配置rndis host
在这里插入图片描述

调试验证

2.1 如果内核配置和代码修改正确,设备启动后,ifconfig -a可以看到usb0节点
在这里插入图片描述
2.2 用AT指令测试4G模块与主控是否通讯正常
发送如下指令,如果看到回复OK,就证明4G模块与主控通讯正常。
至此驱动层应该算调试OK了。
cat /dev/ttyUSB2 &
echo -e “at\r\n”>/dev/ttyUSB2
在这里插入图片描述

应用的编写

fd_Card1 = open("/dev/ttyUSB1", O_RDWR);//打开4G USB串口节点
iot_tty_set_speed(st_tty.fd_net, 115200);			//串口配置,关回显
iot_tty_set_Parity(st_tty.fd_net, 8, 'N', 1);
//AT指令发送的函数
iot_tty_send(&st_tty, "AT+CSQ\r\n", &errcode, buf);
int iot_tty_send(tty_dev_t *tty, char *cmd, int *errcode, char *result)
{
	char buf[MAX_AT_SIZE];
	fd_set	rdfds;
	struct timeval tv;
	int count = 0;		//记录超时次数,多次无法获取结果直接退出了,避免发生阻塞
	int i;
	int ret;
	
	int error_cnt = 0;
	BOOL bRecv = FALSE;		//是否已经接收过数据
	char *ptr = NULL;
	char cmd_tmp[64] = {0};		//去掉AT和? \r\n 只保留参数
	
	*errcode = 0;	
	if((ptr=strstr(cmd, "\r")) != NULL)
	{
		memcpy(cmd_tmp, cmd, ptr - cmd);		//去掉 \r
	}
	if((ptr=strstr(cmd_tmp, "?")) != NULL)
	{
		*ptr = '\0';
	}
	if((ptr=strstr(cmd_tmp, "AT")) != NULL)		//去掉AT
	{
		sprintf(cmd_tmp, "%s",ptr + 2);
	}
	printf("send_at_cmd %s\n", cmd);
	pthread_mutex_lock(&tty->mutex);
	if(tty->fd_net > 0)
	{
		BOOL result_flag = FALSE;		//用来判断是否获取到了所需要的命令
		count = 0;
		memset(buf, 0, sizeof(buf));
		ret = write(tty->fd_net, cmd, strlen(cmd));
		if(ret==-1)
		printf("[lxr_test_send_at_cmd_fail][func=%s][LINE=%d]\n",__func__,__LINE__);
		
		while((strstr(buf, "OK") == NULL && strstr(buf, "ERROR") == NULL) || (!result_flag))	//当返回结果存在ok/error,并且获取到对应命令的结果的时候才退出
		{
			memset(buf, 0, sizeof(buf));
			FD_ZERO(&rdfds);
			FD_SET(tty->fd_net, &rdfds);
			tv.tv_sec = 20;
			tv.tv_usec = 0;
			//printf("[lxr_test_message][func=%s][LINE=%d]\n",__func__,__LINE__);
			ret = select(tty->fd_net + 1, &rdfds, NULL, NULL, &tv);
			//printf("[lxr_test_message][func=%s][LINE=%d]\n",__func__,__LINE__);
			if(ret == 0)
			{
				mlog_write("4G module command executes timeout:%s",cmd_tmp);
				printf("select %d, bRecv:%d, count:%d\n", ret, bRecv, count);
				if(bRecv || (count >= 5))		//(已经接收过数据了,后续仍然有超时) 或者 (超时次数过多),则认为此次命令无ok或者error返回,当出错处理
				{
					*errcode = -1;
					break;;
				}
				else
				{
					write(tty->fd_net, cmd, strlen(cmd));
				}
				count ++;
				continue;
			}
			else if(ret < 0)
			{
				printf("select %d\n", ret);
				pthread_mutex_unlock(&tty->mutex);
				return DEV_TTY_SEND_ERR;
			}
			ret = read(tty->fd_net, buf, 128);
			if(ret == 0)
			{
				error_cnt++;
				if(error_cnt > 3)		//可能是wifi模块被硬件复位了,这里只重新打开USB节点
				{	//这里只重新打开节点
					printf("AT read failed error_cnt:%d\n", error_cnt);
					pthread_mutex_unlock(&tty->mutex);
					return DEV_TTY_SEND_ERR;
				}
			}
			else
			{
				error_cnt = 0;
			}
			bRecv = TRUE;
			
			printf("line:%d AT ret = %d buf:%s,\n",__LINE__, ret, buf);			//这里如果一定数量出错时,重新打开USB试试。

			ptr=strstr(buf, cmd_tmp);
			if(ptr != NULL)
			{
				result_flag = TRUE;
				if(result)
				{
					memcpy(result, ptr, strlen(ptr));
				}
			}
			
			if((ret == 1 && strcmp(buf, "\n") == 0) 
				|| (strstr(buf, "ZLTENOCELL") != NULL)
				|| (strstr(buf, "CREG") != NULL)
				|| (strstr(buf, "CGREG") != NULL)
				|| (strstr(buf, "CEREG") != NULL)
				)		//换行和特定信号过滤
				continue;
		}
		
		

		
		if(strstr(buf, "ERROR") != NULL)
		{
			ret = sscanf(buf, "%*[^0-9]%d", errcode);
			if(!*errcode)
				*errcode = -1;
			
		//	printf("串口返回错误:%s!", buf);
			//mlog_write("Abnormal operation of 4G module:%s:%d",cmd_tmp, errcode);
			printf("AT failed :%d--%s\n", *errcode,buf);
		}
		

	}
	else
	{
		printf("ERROR ERROR ERROR !!! ====== tty->fd_net error\n");
		pthread_mutex_unlock(&tty->mutex);
		return -1;
	}
	pthread_mutex_unlock(&tty->mutex);
	
	return 0;
}

AT的指令的使用

send_at_cmd AT+CEREG?

line:113 AT ret = 31 buf:AT+CEREG? //获取服务状态
+CEREG: 0,1

OK
,
srv_status[1]
svr_mode->srv_status = Normal Service

send_at_cmd AT+CPIN? //卡是否正常

line:113 AT ret = 31 buf:AT+CPIN?
+CPIN: READY

OK
,
svr_mode->bSim = 1
send_at_cmd AT+CPSI? //判断网络模式

line:113 AT ret = 99 buf:AT+CPSI?
+CPSI: LTE,Online,460-00,0x2799,225199169,124,EUTRAN-BAND34,36275,3,0,16,31,31,3

OK
,
svr_mode->mode = 4G
send_at_cmd AT+CICCID//获取CCID号

line:113 AT ret = 48 buf:AT+CICCID 
+ICCID: 89860040192032676363

OK
,
iccid_tmp:89860040192032676363 len=20
//下面是获取信号强度的AT指令
send_at_cmd AT+CSQ

line:113 AT ret = 28 buf:AT+CSQ
+CSQ: 16,99

OK
,
rssi:-101dBm, act:99
====>>>stat:Normal Service

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis plus注解@TableField详解

Mybatis plus注解TableField详解 目录1. 前言2. 应用场景2.1 更新null值2.2 查询时排除字段2.3 非数据库字段属性1. 前言 TableField 字段注解&#xff0c;该注解用于标识非主键的字段。将数据库列与 JavaBean 中的属性进行映射。 2. 应用场景 2.1 更新null值 想要在更新字…

auth模块方法的使用

文章目录1、创建超级用户(管理员)2、获取表&#xff0c;检验密码3、保存用户状态4、获取用户对象&#xff0c;校验用户是否登录5、验证用户是否登录6、修改密码7、注销8、注册9、方法总结10、如何扩展auth_user表1、创建超级用户(管理员) """ 在创建好一个djan…

医保医用耗材编码目录——在线查询

医保医用耗材编码目录是按照“统一分类、统一编码、统一维护、统一发布、统一管理”的总体要求下进行更新维护&#xff0c;旨在强调“分类”与“追溯”属性&#xff0c;助力将医保编码标准统一为新时期医保信息交换的通用语言。 对于医保医用耗材分类与代码数据的“分类”与“追…

高数 | 【数一】 多元函数积分学 —— 总复习框架总结

自用复习笔记。 整理参考于 2023张宇高数18讲、武忠祥十七堂课。 三重积分(质量) 概念与对称性计算 直角坐标系 先一后二法/先z后xy法/投影穿线法(柱体,侧面为柱体)先二后一法/先xy后z法/定限截面法(旋转体)柱面坐标系 = 极坐标下二重积分与定积分球面坐标系 应用 体积总…

开源版禅道的使用教程

文章目录一、禅道简介二、下载安装三、敏捷版基本功能使用四、其他版本使用一、禅道简介 1.官网介绍&#xff1a;国产开源项目管理软件。核心管理思想基于敏捷方法scrum。集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体。 scrum&#xff1a;迭代式增量软…

DHCP地址池耗尽攻击

DHCP地址池耗尽攻击 攻击原理简介 ​ 路由器内置的DHCP服务器&#xff0c;划定了一个地址池作为自动分配给接入终端号IP地址的范围。 ​ 攻击工具伪装成大量的接入主机&#xff0c;向路由器内的DHCP服务器请求大量的IP地址分配。 ​ 在DHCP的地址租期超时之前&#xff0c;已经分…

CentOS 7搭建Yunzai-Bot原神机器人

CentOS 7.6搭建Yunzai-Bot原神机器人 前言 目前使用较多的原神机器人&#xff1a; LittlePaimon ✨基于NoneBot2和go-cqhttp的原神Q群机器人 原神多功能机器人&#xff0c;查询游戏信息、图鉴攻略、树脂提醒等等&#xff0c;以及各种各样的好玩的功能&#xff0c;不仅仅是原神…

行业案例 | 睿眼攻击溯源组合拳让黑客攻击事件无所遁形

项目背景 近年来,网络安全形势愈发严峻&#xff0c;黑客入侵、信息泄露等信息安全事件层出不穷&#xff0c;给企业带来了巨大的经济损失。一是互联网出口应用多为Web应用&#xff0c;有效防护和监测Web应用的安全性是金融行业客户信息安全领域的一项重点工作&#xff1b;二是随…

C++11 lambda+包装器+可变参数模板

索引lambda表达式(1).什么是lambda(2).lambda基本规则(3).lambda实现原理包装器可变参数模板lambda表达式 (1).什么是lambda 假设有这样一个类 struct Goods { string _name; // 名字 double _price; // 价格 int _evaluate; // 评价 }&#xff1b;现在要将商品分别按照名字…

“健康中国”战略下如何推进公共卫生建设,海尔生物医疗给出“智慧答案”

【潮汐商业评论/原创】 公共卫生是一个老话题&#xff0c;但在新时代的背景下正在呈现出诸多新故事。在人民健康需求日益提升的当下&#xff0c;推动公共卫生服务体系的高效、便捷升级成了新时期的一大命题&#xff0c;而这一问题的答案则指向了公共卫生需要“数智化”。 在此…

Python之第十章 IO及对象列化

目录 Python之第十章 IO及对象列化 1.IO流&#xff08;IO stream&#xff09; 1.概述 2.IO流定义 3.流的分类 2.open方法 1.过程 2.缓冲区&#xff08;buffer&#xff09; 使用缓存区的必要性&#xff1a; 缓冲区分类&#xff1a; 3.格式 4.b模式 5.模式 6.文件对…

CentOS 7搭建LittlePaimon原神机器人

CentOS 7.6搭建LittlePaimon原神机器人 前言 最近小伙伴说别人的QQ群里有个原神的机器人&#xff0c;可以随时查询自己账号的角色卡信息。然后我自己查了下资料&#xff0c;发现不是很难弄&#xff0c;所以帮忙也弄了一个。 目前使用较多的原神机器人&#xff1a; LittlePaim…

SpringMVC学习篇(八)

SpringMVC拦截器 1.拦截器和过滤器的区别 过滤器拦截器servlet规范中(java ee)规范中的一部分,任何java web工程都可以使用拦截器是框架提供的,如只有在SpringMVC框架下的工程才能使用其提供的拦截器在url-pattern中配置了/*之后,可以拦截任何一切资源拦截器只会拦截控制器方…

easyrecovery工具2023最新版一键恢复丢失数据免费下载

通常&#xff0c;许多人会将工作或生活中的数据存储在我们的计算机上。很多时候&#xff0c;由于我们的误操作或其他一些问题&#xff0c;很容易错误地删除一些文件和数据。特别是&#xff0c;一些计算机故障总是会导致数据丢失&#xff0c;这是非常麻烦的。当需要重新安装系统…

JS 对象总结

对象 创建对象 有两种方式&#xff1a; 通过 new 操作符实例化一个对象&#xff0c;再添加属性。 let person new Object(); person.name "孤城浪人"; person.sayName function() { console.log(this.name); };构造函数&#xff0c;若不需要传参&#xff0…

代码随想录——单词接龙(图论)

题目 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列&#xff1a; 序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。 给你两个单词 b…

AWVS的简介与安装

目录预备知识实验目的实验环境实验步骤一任务描述&#xff1a;AWVS的简介实验步骤二任务描述&#xff1a;进行AWVS10.5的安装、界面介绍和简单的使用实验步骤三任务描述&#xff1a;AWVS 11.x的安装与简单使用预备知识 Acunetix Web Vulnerability Scanner&#xff08;简称AWV…

Qtcreator中文显示乱码问题终于解决

问题描述&#xff1a;Qtcreator安装好后打印中文在控制台输出乱码&#xff08;自己也在网上查找了好久&#xff0c;终于找到解决方法了&#xff09;。 原因剖析&#xff1a;因为项目的编码与控制台的编码不一致导致的&#xff0c;而qt编码设置里并没有控制台的默认编码&#xf…

华为M-LAG跨设备链路聚合技术理论讲解

目录 为什么会出现M-LAG M-LAG基本概念 M-LAG建立过程 M-LAG的协议兼容性 M-LAG的防环机制 M-LAG正常工作流量转发 单播流量转发 组播流量转发 广播流量转发 M-LAG故障场景流量转发 上行链路故障 下行链路故障 M-LAG主设备故障 Peer-link故障 M-LAG二次故障&…

Kafka部署实验

一、实验介绍 1.1实验内容 实验在Hadoop集群上部署Kafka分布式发布订阅消息系统&#xff0c;并完成kafka消息管理验证。 1.2实验知识点 Kafka集群部署 Kafka消息处理流程 1.3实验环境 Kafka2.11 网易云平台 1.4实验资源 资源名称存储目录Kafka安装包/opt/software/pack…