当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/112030.html

相关文章:

  • Golang 中实现实时聊天通讯
  • 前端面试的性能优化部分(5)每天10个小知识点
  • 【链表OJ 1】移除链表元素val
  • 复原 IP 地址——力扣93
  • OSPF综合实验
  • 安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案
  • Linux 匿名页的生命周期
  • 设计模式概述与UML图
  • 使用Vscode编辑keil工程
  • 编译工具:CMake(一) | 简介与安装
  • 深度学习(34)—— StarGAN(1)
  • ES6系列之let、const、箭头函数使用的坑
  • 4.DNS和负载均衡
  • 【JavaEE进阶】Spring核心与设计思想
  • 实习周记第三周
  • 11. 使用tomcat中碰到的一些问题
  • C++解决TCP粘包
  • 最长快乐前缀——力扣1392
  • 使用java.util.List的containsAll()方法可能导致的问题
  • 在线文本转语音播放 (TTS)
  • OPTEE之ARM安全扩展
  • Vue [Day4]
  • google chrome 官方下载
  • Misc取证学习
  • vue打包到jar资源访问被shiro拦截
  • 选择排序(指针法)
  • 8.6 day07 休息+剑指offer
  • K8S系列文章 之 容器存储基础 Volume
  • 【CHI】架构介绍
  • hcip的ospf综合实验