STM32 4G学习

news2024/11/29 3:58:56

硬件连接

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 中的内容。

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

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

相关文章

详细介绍golang中.()类型断言的使用方法

文章目录 一、什么是.()用法?二、.()的基本用法三、.()用法的高级应用3.1 nil类型的转换3.2 将函数作为参数传递 四、.()使用中的注意事项五、总结 Golang是一门非常流行的编程语言,在很多领域都有着广泛的应用。在开发过程中,很多时候我们需…

verxriscv中Fpu中的加法器add源码分析

一 加法器端口 case class AddInput() extends Bundle{val source = Source()val rs1, rs2 = FpuFloat(exponentSize = p.internalExponentSize, mantissaSize = p.internalMantissaSize+addExtraBits)val rd = p.rfAddress()val roundMode = FpuRoundMode()val format = p.wit…

华为harmonyos4.0鸿蒙4.0安装谷歌服务框架Play商店,解决从服务器检索信息时出错

8月4号华为手机发布了全新的harmonyos4.0鸿蒙4.0系统,很多人需要问还是不是支持谷歌服务框架?那么答案是肯定的,它和鸿蒙3是一样的,一样的操作,一样的支持安装谷歌服务框架,安装Google play商店。测试机型&…

【新】通达OA前台反序列化漏洞分析

0x01 前言 注:本文仅以安全研究为目的,分享对该漏洞的挖掘过程,文中涉及的所有漏洞均已报送给国家单位,请勿用做非法用途。 通达OA作为历史上出现漏洞较多的OA,在经过多轮的迭代之后已经很少前台的RCE漏洞了。一般来说…

python+requests+json 接口测试思路示例

实际项目中用python脚本实现接口测试的步骤: 1 发送请求,获取响应 》》2 提取响应里的数据,对数据进行必要的处理 》》3 断言响应数据是否与预期一致 以豆瓣接口为例,做一个简单的接口测试吧。使用到的知识涉及requests库&…

Vue3 第三节 计算属性,监视属性,生命周期

1.computed计算属性 2.watch监视函数 3.watchEffect函数 4.Vue的生命周期函数 一.computed计算属性 计算属性简写和完整写法 <template><h1>一个人的信息</h1>姓&#xff1a;<input type"text" v-model"person.firstName" />…

车载A2B总线AD2428主从模式调试问题汇总

一&#xff0c;简介 在实际A2B总线一主一从模式的调试过程中下载程序出现许多报错提示&#xff0c;本文将遇到的错误进行汇总记录&#xff0c;方便相关开发者进行参考。 二&#xff0c;错误现象 2.1 Cable Terminal Shorted to Ground 主机IIS&#xff08;TDM&#xff09;线…

Mir 2.14 正式发布,Ubuntu 使用的 Linux 显示服务器

Canonical 公司最近发布了 Mir 2.14&#xff0c;这是该项目的最新版本。 Mir 2.14 在 Wayland 方面通过 ext-session-lock-v1 协议增加了对屏幕锁定器 (screen lockers) 的支持&#xff0c;并最终支持 Wayland 拖放。此外还整合了渲染平台的实现&#xff0c;放弃了之前在 Raspb…

常见监控网络链路和网络设备的方法

网络监控主要包括网络链路监控和网络设备监控&#xff0c;通常系统运维人员会比较关注。 一、网络链路监控 网络链路监控主要包含三个部分&#xff0c;网络连通性、网络质量、网络流量。 连通性和质量的监控手段非常简单&#xff0c;就是在链路一侧部署探针&#xff0c;去探…

搭建 elasticsearch8.8.2 伪集群 windows

下载windows 版本 elasticsearch8.8.2 以下链接为es 历史版本下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic windows 单节点建立方案&#xff1a; 下载安装包 elasticsearch-8.8.2-windows-x86_64.zip https://artifacts.elastic.co/download…

设计模式原来是这样

目录 概述: 什么是模式&#xff01;&#xff01; 为什么学习模式&#xff01;&#xff01; 模式和框架的比较&#xff1a; 设计模式研究的历史 关于pattern的历史 Gang of Four(GoF) 关于”Design”Pattern” 重提&#xff1a;指导模式设计的三个概念 1.重用(reuse)…

Linux:shell脚本:基础使用(2)

test命令 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] (前后至少应有一个空格) 常用的测试操作符 -d&#xff1a;测试是否为目录&#xff08;Directory) -e&#xff1a;测试目录或文件是否存在&#xff08;Exist&#xff09; -f&#xff1a;测试是否…

【C++】Lambda表达式的使用

学习目标&#xff1a; 例如&#xff1a; 了解Lambda的优点 掌握Lambda表达式的使用 了解Lambda表达式的底层原理 学习内容&#xff1a; Lambda表达式的语法 文章目录 学习目标&#xff1a;学习内容&#xff1a;Lambda表达式排序案例Lambda表达式语法捕捉列表Lambda表达式模拟…

20230806将ASF格式的视频转换为MP4

20230806将ASF格式的视频转换为MP4 2023/8/6 18:47 缘起&#xff0c;自考中山大学的《计算机网络》&#xff0c;考试《数据库系统原理》的时候找到视频&#xff0c;由于个人的原因&#xff0c;使用字幕更加有学习效率&#xff01; 由于【重型】的PR2023占用资源较多&#xff0c…

laravel语言包问题

1、更新vendor composer require "overtrue/laravel-lang:3.0" 2、修正配置文件 config/app.php 3、 php artisan config:clear 更新缓存 4、设定新的语言包 在这个resources\lang目录下加即可

海康威视摄像头配置RTSP协议访问、onvif协议接入、二次开发SDK接入

一、准备工作 (1)拿到摄像头之后,将摄像头电源线插好,再将网线插入到路由器上。 (2)将自己的笔记本电脑也连接到路由器网络,与摄像头出在同一个局域网。 二、配置摄像头 2.1 激活方式选择 第一次使用设备需要激活,在进行配置。 最简单,最方便的方式是选择浏览器激…

【嵌入式环境下linux内核及驱动学习笔记-(18)LCD驱动框架1-LCD控制原理】

目录 1、LCD显示系统介绍1.1 LCD显示基本原理1.1.1 颜色的显示原理&#xff1a;1.1.2 图像的构成 1.2 LCD接口介绍1.2.1 驱动接口 - MCU接口1.2.2 驱动接口 - RGB接口1.2.3 驱动接口 - LVDS接口1.2.4 驱动接口 - MIPI接口1.2.5 RGB / MIPI / LVDS三种接口方式的区别&#xff1a…

【数据结构OJ题】轮转数组

原题链接&#xff1a;https://leetcode.cn/problems/rotate-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 1. 方法一&#xff1a;暴力求解&#xff0c;将数组的第一个元素用临时变量tmp存起来&#xff0c;再将数组其他元素往右挪动一步&…

分享kubernetes部署:基于Ansible自动安装kubernetes

基于Ansible自动安装kubernetes 环境准备 我们以如下机器环境为例&#xff1a; 开放端口&#xff1a; 控制平面节点 工作节点 请按如上中规定的开放端口&#xff0c;或关闭防火墙&#xff1a; systemctlstopfirewalld&&\ systemctldisablefirewalld 安装常用工具 sudo…

【UE4】多人联机教程(重点笔记)

效果 1. 创建房间、搜索房间功能 2. 根据指定IP和端口加入游戏 步骤 1. 新建一个第三人称角色模板工程 2. 创建一个空白关卡&#xff0c;这里命名为“InitMap” 3. 新建一个控件蓝图&#xff0c;这里命名为“UMG_ConnectMenu” 在关卡蓝图中显示该控件蓝图 打开“UMG_Connec…