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)