CH9121_MQTT应用

参考代码程序下载:https://files.cnblogs.com/files/blogs/808422/EXAM_mqtt_912x.zip?t=1729489963&download=true

前言:

(1)很多物联网\嵌入式应用需要将采集的数据上传到MQTT服务器以实现集中实时管理。然而可能前期选型时并未考虑到这一点导致选用的MCU没有网络功能无法实现。并且可能开发人员对于网络部分并不是很了解,项目急学习成本较高。

针对于此类需求,此时推荐看一下沁恒的CH9121\CH9120,这是一款串口转网口的透传芯片,无需代码开发,配套上位机工具,输入相应参数并接上mcu串口,即可将mcu拓展出网口功能。

芯片手册及开发包:搜索 CH9121 - 南京沁恒微电子股份有限公司 (wch.cn)

 

(2)本文测试为:CH32v307+CH9121,搭配EMQX这一款mqtt服务器进行测试。

该款软件的安装方式、mqtt协议介绍以代码中mqtt驱动解析参考此链接:CH395+EMQX实现MQTT应用(Windows系统) - Lqqq123 - 博客园 (cnblogs.com)

 

部分关键代码解析

(1)CH912x.c文件中119行,串口中断函数。

 1 void USART2_IRQHandler(void)
 2 {
 3     u8 sta;
 4 
 5     if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)//
 6     {
 7         MyBuffer[rec_len++] = USART_ReceiveData(USART2);
 8     }
 9     else if(USART_GetFlagStatus(USART2, USART_FLAG_IDLE) != RESET)
10     {
11         sta = USART2->STATR;
12         sta = USART2->DATAR;
13         Rec_overFlag = 1;
14     }
15 }

因为CH9121是一款透传芯片,所以网口来了数据直接会从串口透传出来,想要接收完整的一帧数据,要借助到线路空闲(IDLE)这一中断源来判断一帧数据已经全部接受完毕。通过先读状态寄存器再读数据寄存器可以清除此中断。详细参考CH32v307手册,此处不过多赘述。(注:结合实际mcu型号,不同型号mcu可能处理方式不同)

 (2)CH912x.c文件中321行

 1             if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==RESET )//将mcu的pA0引脚和9121的TCPCS1(芯片30脚)连上
 2             {                                                  //通过电平状态检测tcp是否连接上
 3                Rec_startFlag = 1;//tcp连接已建立,开始mqtt应用
 4                MQTT_Connect(username, password);
 5                printf("TCP Connect Success!\r\n");
 6             }
 7             else
 8             {
 9                 printf("TCP Connect-ing!\r\n");
10                 con_flag = 0;
11             }

通过将mcu的PA0引脚接到CH9121的TCPCS1(30脚)引脚上,借此来判断tcp连接是否已经建立成功从而发送MQTT_Connect报文。

此处有两种方式可以判断tcp连接是否建立:

①按照上述方式将tcpcs1引脚引出和mcu的一个gpio脚连起来,判断电平状态。此种方式最直接简单,推荐。

②如果硬件引脚没有引出,可以通过串口指令的方式判断tcp连接状态从而实现功能。

发送串口指令前,要先进入串口配置模式,发完指令后再退出串口配置模式即可。

关于CH9121串口配置模式的说明及代码例程,参考此链接:CH9121串口指令配置参考 - Lqqq123 - 博客园 (cnblogs.com)

 

posted on 2024-10-21 14:32  Lqqq123  阅读(50)  评论(0编辑  收藏  举报

导航