STM32 4G学习

硬件连接

ATK-IDM750C模块可直接与正点原子 MiniSTM32F103开发板板载的ATK模块接口(ATK-MODULE)进行连接。
在这里插入图片描述
在这里插入图片描述

功能说明

ATK-IDM750C是正点原子(ALIENTEK)团队开发的一款高性能4G Cat1 DTU产品,支持移动4G、联通4G和电信4G手机卡。
它以高速率、低延迟和无线数传作为核心功能,可快速解决应用场景下的无线数传方案。

它支持TCP、UDP、HTTP、MQTT、DNS、RNDIS、NTP协议,支持连接多种云服务器(如:原子云、阿里云、百度云和OneNET)、支持TCP/UDP/HTTP/MQTT数据透传,支持USB无线网卡,持自动定时采集任务、支持基站定位、支持自定义心跳包和注册包数据,支持上位机/AT指令/短信/透传指令配置参数,支持RS232和RS485两种串行接口,它可以广泛用于无线数传、电力行业、工业控制、水利行业、环保行业、农业应用、集抄系统和智能家居等诸多领域。

源码解读

打开实验的工程文件夹,能够在/Drivers/BSP目录下看到ATK_IDM750C子文件夹,该文件夹中就包含了ATK-IDM750C的驱动文件。
在这里插入图片描述
uart的文件是开发板与ATK-IDM750C通讯使用的UART驱动文件。

atk_idm750c.c 和 atk_idm750c.h 是 ATK-IDM750C 的驱动文件,包含了ATK-IDM750C的初始化。

函数ATK_IDM750C_init(),用于初始化ATK-IDM750C模块

//模块初始化
//baudtrate:ATK-IDM750C UART通讯波特率
uint8_t atk_idm750c_init(uint32_t baudrate)
{
	atk_idm750c_uart_init(baudrate);
	atk_idm750c_dtu_enter_configmode();
	if(atk_idm750c_at_test() != ATK_IDM750C_EOK){
		return ATK_IDM750C_ERROR;
	}
	return ATK_IDM750C_EOK;
}

通过UART与ATK_IDM750C模块进行通信。由于这个模块仅用到TX与RX两个引脚用作通讯,因此模块不需要再配置其它引脚的高低电平,只需要配置串口波特率的数值。

atk_idm750c_dtu_enter_configmode();这个函数的作用在于模块进行初始化的同时,发送相应的AT指令,让模块进入配置模式。

最终完成模块的初始化,初始化完成后再进行相应的参数就可以进入网络透传模式,实现与原子云互发消息的功能。发送的数据与接收的数据就可以通过原子云云端与使用者的上位机进行查看。

//发送AT指令
//cmd:待发送的AT指令,ack:等待的响应,timeout:等待超时时间
uint8_t atk_idm750c_send_cmd_to_dtu(char *cmd,char *ack,uint32_t timeout){
	uint8_t *ret = NULL;
	if(cmd != NULL)
	{
		atck_idm750c_uart_rx_restart();
		atk_idm750c_uart_printf("%s\r\n", cmd);
	}
	if ((ack == NULL) || (timeout == 0))
	 {
	 	return ATK_IDM750C_EOK;
	 }else{
 		while(timeout > 0){
 			ret = atk_idm750c_uart_rx_get_frame();
 			if (ret != NULL)
			 {
				 if (strstr((const char *)ret, ack) != NULL)
				 {
				 	return ATK_IDM750C_EOK;
				 }
				 else
				 {
				 	atk_idm750c_uart_rx_restart();
				 }
			 }
			 timeout--;
			 delay_ms(1);
 		}
 		return ATK_IDM750C_ETIMEOUT;
 	}
}

这个函数为AT指令发送处理,函数中通过串口获取模块接收到的一帧数据,cmd作为AT指令的一个载体,函数对cmd进行判断,若cmd不为空,则串口重新接收数据,并通过串口打印输出 cmd,此时 cmd 里是已经存有了相应的AT 指令。

实验测试代码

//用于与模块建立通讯,并且通过执行一些AT指令对模块进行相应的配置。
void demo_run(void)
{
	uint8_t ret;
	uint8_t *buf;
	uint8_t key;

	//初始化模块
	ret = atk_idm750c_init(115200);
	if(ret != 0){
		printf("ATK-IDM750C init failed!\r\n");
		while (1)
		 {
			 LED0_TOGGLE();
			 delay_ms(200);
		 }
	}
	printf("Wait for Cat1 DTU to start, wait 10s....\r\n");
	//AT指令测试
	ret = atk_idm750c_at_test();
	//工作模式设置
	ret += atk_idm750c_query_workmode(ATK_IDM750C_WORKMODE_NET);
	/* ATK-IDM750C 第一路连接使能状态:ON */
	 ret += atk_idm750c_link1en(ATK_IDM750C_LINK1EN_ON);
	 /* ATK-IDM750C 第一路连接参数 */
	ret +=
	atk_idm750c_link1(ATK_IDM750C_LINK1MODE_TCP,DEMO_DTU_TCP_SERVER_DOMAIN_NAME,
	DEMO_DTU_TCP_SERVER_PORT_NUMBER);
	 /* ATK-IDM750C 第一路连接模式:LONG */
	 ret += atk_idm750c_link1md(ATK_IDM750C_LINK1MD_LONG);
	 /* ATK-IDM750C 第一路超时重连时间 */
	 ret +=atk_idm750c_link1_timeout();
	 /* ATK-IDM750C 第二路连接使能状态:OFF */
	 ret += atk_idm750c_link2en(ATK_IDM750C_LINK2EN_OFF);
	 /* ATK-IDM750C 第三路连接使能状态:OFF */
	 ret += atk_idm750c_link3en(ATK_IDM750C_LINK3EN_OFF);
	 /* ATK-IDM750C 第四路连接使能状态:OFF */
	 ret += atk_idm750c_link4en(ATK_IDM750C_LINK4EN_OFF);
	 /* ATK-IDM750C 启用原子云 */
	 ret += atk_idm750c_set_yuanziyun(ATK_IDM750C_SET_YUANZIYUN_ON);
	 /* ATK-IDM750C 原子云设备编号 */
	 ret += atk_idm750c_device_num(DEMO_DTU_TCP_YUANZI_DEVICE_NUMEBER);
	 /* ATK-IDM750C 原子云设备密码 */
	 ret += atk_idm750c_device_password(DEMO_DTU_TCP_YUANZI_DEVICE_PASSWORD);
	 /* ATK-IDM750C 开启心跳包 */
	 ret += atk_idm750c_heartbeat_package(ATK_IDM750C_HRTEN_ON);
	 /* ATK-IDM750C 心跳包数据 */
	 ret += atk_idm750c_heartbeat_package_data();
	 /* ATK-IDM750C 心跳包时间间隔 */
	 ret += atk_idm750c_heartbeat_package_interval();
	 /* ATK-IDM750C 注册包默认关闭 */
	 ret += atk_idm750c_registration_package(ATK_IDM750C_SET_REGEN_OFF);
	 /* ATK-IDM750C 注册包数据 */
	 ret += atk_idm750c_registration_package_data();
	 /* ATK-IDM750C 注册包发送方式 */
	 ret += atk_idm750c_registration_package_send_method();
	 /* ATK-IDM750C 注册包数据类型 */
	 ret += atk_idm750c_registration_package_data_type();
	 /* ATK-IDM750C 进入透传状态 */
	 ret += atk_idm750c_enter_transfermode();
	 if(ret!=0){
	 	while (1)
		 {
		 LED0_TOGGLE();
		 delay_ms(200);
		 }
	 }
	 atk_idm750c_uart_rx_restart();
	 while (1)
	 {
		 key = key_scan(0);
		 
		 if(key == KEY0_PRES)
		 {
			 /* 如果服务器格式对数据有要求,请修改对应的数据格式,这里只限于例程测试使用 */
			 atk_idm750c_uart_printf("%s\r\n", DEMO_DTU_TEST_DATA);
		 }
		 
		 buf = atk_idm750c_uart_rx_get_frame();
		 if (buf != NULL)
		 {
			 printf("%s", buf);
			 atk_idm750c_uart_rx_restart();
	 	}
		 
		 LED1_TOGGLE();
		 delay_ms(10);
 	}
}

循环里设置了一个按键操作,发送信息至云端,同时,若云端向单片机发送信息,会通过函数atk_idm750c_uart_rx_get_frame()接收信息,并将信息通过buf进行存储,此时判断 buf 是否为空,若不为空则通过串口助手打印储存在 buf 中的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

健启星|医学营养的市场先行者

随着《“健康中国2030”规划纲要》、《国民营养计划(2017-2030年)》等政策的陆续发布,标志着以传统药物治疗为中心的医疗模式时代正式转型到以预防和康复为中心的新的医学营养时代。在此背景下,符合时代需求的特医食品成为“医学营…

vxe table: 实现tree表格,并且自定义展示指定行

要求,数据中必须有唯一的id字段,并且row-config.KeyField 要指定这个id字段。否则在自定义展开行时展开不生效。并不影响tree的渲染 数据有两种形式 普通数据结构tree 状结构, 以树状结构为例: 首先我们要将普通结构的数据,按…

JMeter 的并发设置教程

JMeter 是一个功能强大的性能测试工具,可以模拟许多用户同时访问应用程序的情况。在使用 JMeter 进行性能测试时,设置并发是非常重要的。本文将介绍如何在 JMeter 中设置并发和查看报告。 设置并发 并发是在线程组下的线程属性中设置的。 线程数&#…

CentOS 7 构建 LVS-DR 群集 nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 DS(Director Server):DIP 192.168.231.132 & VIP 192.168.231.200 [root132 ~]# nmcli c show NAME UUID TYPE DEVICE ens33 c89f4a1a-d61b-4f24-a260…

实现Jenkins自动发包配置

参考抖音:Java不良人 其中的视频演示代码 不推荐把jenkins端口一直开放,推荐使用时候放开(版本不太新,避免漏洞攻击) [rootVM-4-12-centos soft]# docker-compose -v Docker Compose version v2.19.1docker-compose.…

零基础看懂免费开源的Stable Diffusion

文章目录 前言Diffusion模型推理过程训练过程 Stable Diffusion模型参考 前言 前面一篇文章主要讲了扩散模型的理论基础,还没看过上篇的小伙伴可以点击查看:DDPM理论基础。这篇我们主要讲一下一经推出,就火爆全网的Stable Diffusion模型。St…

策略模式(C++)

定义 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换((变化)。该模式使得算法可独立手使用它的客户程序稳定)而变化(扩展,子类化)。 ——《设计模式》GoF 使用场景 在软件构建过程中,某些对象使用的算法可能多种多…

神码ai伪原创【php源码】

大家好,小编为大家解答python必备常用英语词汇笔记的问题。很多人还不知道python中常用的英语单词,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图: 一.什么是注释 注释是对一段代码的解释,不参与程序运行&…

dubbo之整合SpringBoot

目录 zookeeper安装 1.拉取ZooKeeper镜像 2.新建文件夹 3.挂载本地文件夹并启动服务 4.查看容器 5.进入容器(zookeeper) Dubbo Admin安装 1.下载dubbo-admin 2.zip包解压 3.修改配置文件 4.打包项目 5.启动jar 6.访问 构建项目 api模块 1.创建…

无涯教程-Perl - getservbyport函数

描述 此功能转换协议PROTO的服务编号PORT,在标量context中返回服务名称,并在列表context中返回名称和相关信息- ($name,$aliases,$port_number,$protocol_name) 该调用基于/etc/services文件返回这些值。 语法 以下是此函数的简单语法- getservbyport PORT, PROTO返回值 …

将vsCode 打开的多个文件分行(栏)排列,实现全部显示,便于切换文件

目录 1. 前言 2. 设置VsCode 多文件分行(栏)排列显示 1. 前言 主流编程IDE几乎都有排列切换选择所要查看的文件功能,如下为Visual Studio 2022的该功能界面: 图 1 图 2 当在Visual Studio 2022打开很多文件时,可以按照图1、图2所示找到自…

伺服系统::编码器

一、主要分类 二、组成与原理 光电编码器 磁编码器:N-->磁感元件(0);S-->磁感元件(1)》脉冲 增量编码器的分辨率、倍频与细分技术 (99 封私信 / 81 条消息) 编码器有什么分类? - 知乎 (z…

安卓:UDP通信

目录 一、介绍 网络通信的三要素: (1)、IP地址: IPv4: IPv6: IP地址形式: IP常用命令: IP地址操作类: (2)、端口: (3)、协议: UDP协…

搭建Docker环境

目录 一、docker环境搭建 1、卸载旧版本docker 2、安装依赖和设置仓库 3、安装docker 4、启动并加入开机启动 5、验证是否安装成功 二、利用docker搭建nginx 1、拉取镜像 2、启动容器,部署nginx 一、docker环境搭建 1、卸载旧版本docker yum remove docke…

SD NAND FLASH : 什么是pSLC?

一、什么是pSLC pSLC(Pseudo-Single Level Cell)即伪SLC,是一种将MLC/TLC改为SLC的一种技术,现Nand Flash基本支持此功能,可以通过指令控制MLC进入pSCL模式,存储时在MLC的每个单元中仅存储1bit数据&#x…

基于k8s job设计与实现CI/CD系统

方案一:Jenkinsk8sCICD 方案二:kanikok8s jobCICD CICD 基于K8s Job设计流水线 CI方案 工具镜像 云原生镜像打包工具 kaniko的使用 与Jenkins对比 可用性与易用性

IntelliJ IDEA 2021/2022关闭双击shift全局搜索

我这里演示的是修改,删除是右键的时候选择Remove就好了 IDEA左上角 File-->Settings 找到Navigate -->Search Everywhere ,右键添加快捷键。 OK --> Apply应用

高端百度地图开发1:自定义水滴头像(自定义标注覆盖物、Overlay覆盖类)

自定义水滴头像&自定义标注覆盖物 一、引入百度地图JSAPI库二、构建map容器1. CSS样式表2.HTML容器 三、核心代码1.百度地图API功能2.定义构造函数并继承Overlay3.初始化自定义覆盖物4.绘制覆盖物5.添加覆盖物 自定义标注覆盖物(Custom Overlay)是百…

从小白到大神之路之学习运维第78天-------Kubernetes集群应用部署测试

第四阶段 时 间:2023年8月11日 参加人:全班人员 内 容: Kubernetes集群应用部署测试 目录 应用部署测试 应用部署测试 下面我们部署一个简单的Nginx WEB服务,该容器运行时会监听80端口。 (一)环境…

UE5、CesiumForUnreal接入WMTS格式地图瓦片,如ArcGIS、Mapbox、天地图

文章目录 1.实现目标2.实现过程2.1 WMTS与TMS2.2 cesium-native改造2.3 CesiumForUnreal插件改造2.4 WMTS瓦片加载测试2.5 EPSG:3857与43263.参考资料1.实现目标 通过改造cesium-native和CesiumForUnreal插件,参考tms的栅格瓦片地图加载逻辑,实现在UE5中通过CesiumForUnreal…