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 中的内容。
相关文章:

STM32 4G学习
硬件连接 ATK-IDM750C模块可直接与正点原子 MiniSTM32F103开发板板载的ATK模块接口(ATK-MODULE)进行连接。 功能说明 ATK-IDM750C是正点原子(ALIENTEK)团队开发的一款高性能4G Cat1 DTU产品,支持移动4G、联通4G和…...
Golang 中实现实时聊天通讯
客户端代码 package mainimport ("fmt""log""net/url""os""os/signal""time""github.com/gorilla/websocket" )func main() {interrupt : make(chan os.Signal, 1)signal.Notify(interrupt, os.Interr…...
前端面试的性能优化部分(5)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...

【链表OJ 1】移除链表元素val
大家好,欢迎来到我的博客,此题是关于链表oj的第一题,此后还会陆续更新博客,如有错误,欢迎大家指正。 来源:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目: 方法一:定义prev和cur指针…...

复原 IP 地址——力扣93
文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<...

OSPF综合实验
实验题目如下: 实验拓扑如下: 实验要求如下: 【1】R4为ISP,其上只能配置IP地址: R4与其他所有直连设备间使用公有 【2】R3---R5/6/7为MGRE环境,R3为中心站点 【3】整个OSPF环境IP地址为172.16.0.0/16 【4】所有设备…...

安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案
联发科MTK6785(Helio G95)安卓核心板采用八核 CPU 具有两个强大的 Arm Cortex-A76 处理器内核,主频高达 2.05GHz,外加六个 Cortex-A55 高效处理器。其强大的图形性能由 Arm Mali-G76 MC4 提供,速度可提升至 900MHz 。 …...

Linux 匿名页的生命周期
目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时)来分配内存,在内核空间发生…...

设计模式概述与UML图
文章目录 一、设计模式概述1. 软件设计模式的产生背景2. 软件设计模式的概念3. 学习设计模式的必要性4. 设计模式分类(1)创建型模式(2)结构型模式(3)行为型模式 二、UML图1. 类图概述2. 类图作用3. 类图表示…...

使用Vscode编辑keil工程
一、需要安装的插件 1. Keil Assistant 2. C/C 3. 中文配置: 二、插件配置 1. Keil Assistant 添加Keil的安装路径 接下来就可以使用vscode编辑Keil的工程了,调试编译和下载程序需要返回到Keil中进行操作。 三、Vscode常用快捷键 可以自定义进行配置…...

编译工具:CMake(一) | 简介与安装
编译工具:CMake(一) | 简介与安装 1. CMake简介1.1CMake的特点 2. CMake 安装 这个是CMake的图标 1. CMake简介 cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一…...

深度学习(34)—— StarGAN(1)
深度学习(34)—— StarGAN(1) 文章目录 深度学习(34)—— StarGAN(1)1. 背景2. 基本思路3. 整体流程4. StarGAN v2(1) 网络结构(2) mapping network(3) style encoder(4)Loss 和之前…...

ES6系列之let、const、箭头函数使用的坑
变量提升块级作用域的重要性箭头函数this的指向rest参数和arguments 1.ECMAScript与Js的关系 2.Babel转码器 Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着,你可以用ES6的方式编写程序&…...

4.DNS和负载均衡
文章目录 coreDNS概念部署croeDNS测试 kubernetes多master集群结构master节点部署 负载均衡配置部署nginx做四层反向代理安装高可用 keepalivednginx监控脚本修改k8s中组件的配置文件 coreDNS 概念 coreDNS是kubernetes的默认DNS实现。可以为集群中的service资源创建一个资源名…...

【JavaEE进阶】Spring核心与设计思想
文章目录 一. Spring框架概述1. 什么是Spring框架2. 为什么要学习框架?3. Spring框架学习的难点 二. Spring 核心与设计思想1. 什么是容器?2. 什么是IoC?3. Spring是IoC容器4. DI(依赖注入)5. DL(依赖查找) 一. Spring框架概述…...
实习周记第三周
第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多,但是小的细节蛮多。 值得一提的是,第二周做的微信小程序,改了很多逻辑。改逻辑需要与后端进行联调,收获很大,思路也愈发清楚。 记录做了什么是好习…...

11. 使用tomcat中碰到的一些问题
文章目录 问题一:Tomcat的startup.bat启动后出现乱码问题二:一闪而退之端口占用问题三:非端口问题的一闪而退问题四:服务器的乱码和跨域问题问题五: 在tomcat\webapps\下创建文件夹为什么tomcat重启就会丢失问题六:Tom…...
C++解决TCP粘包
目录 TCP粘包问题TCP客户端TCP服务端源码测试 TCP粘包问题 TCP是面向连接的,面向流的可靠性传输。TCP会将多个间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包发送,这样一个数据包里就可能含有多个消息的数据&#…...

最长快乐前缀——力扣1392
文章目录 题目描述KMP题目描述 KMP class Solution {public:string longestPrefix(string s) {int n = s...
使用java.util.List的containsAll()方法可能导致的问题
今天在偶然之间发现了一个bug,原因居然是使用了containsAll()方法,这个问题很简单,看以下代码就能发现很大的问题。 package collection;import java.util.ArrayList; import java.util.List;/*** author heyunlin* version 1.0*/ public cl…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...