本帖最后由 51xlf 于 2023-12-28 10:55 编辑
#申请原创# @21小跑堂
stm32使用NT1-B实现了远程的tcp和UDP的连接。代码只需要配置串口就行实现数据的发送和接收了。之前都是使用w5500或者esp8266来做网络配置,需要实现的代码比较复杂,而且会占用比较多的内存。
使用w5500或者esp8266做mqtt的话,还需要自己移植相关的mqtt代码过来,或者下载mqtt的固件才能使用。MQTT是一种轻量级的、基于发布/订阅模式的通讯协议,它能够在带宽有限和延迟敏感的网络环境中提供可靠的消息传输服务。
W5500实现MQTT:
在W5500上实现MQTT通常需要使用其内置的TCP/IP栈来建立与MQTT服务器的连接。
需要编写代码来处理MQTT协议的连接、断开、发布和订阅消息等操作。
W5500的官方SDK通常提供网络协议栈的支持,但MQTT协议的实现可能需要用户自己完成或使用第三方的库。
ESP8266实现MQTT:
ESP8266可以通过其内置的Wi-Fi功能直接连接到支持MQTT的Wi-Fi网络。
在ESP8266上实现MQTT可以使用Espressif提供的AT指令集,或者使用Arduino IDE和相关的库(如ESP8266WiFi和PubSubClient)。
使用Arduino IDE时,可以通过简单的函数调用来实现MQTT客户端的功能,例如 client.subscribe() 和 client.publish()。
但是NT1-B可以实现网络页面配置或者使用软件配置,这个非常简单。
1. stm32的串口配置
这里使用的是stm32cubemx实现的。
首先要配置串口的接收和发送。配置串口1和2的波特率为115200。
串口2用于接收数据,串口1用于发送调试数据。
这里需要配置串口的接口中断为使能。
然后使用keil打开工程代码。
首先要重定向串口1为调试接口
// 重定向printf函数
int fputc(int ch,FILE *f)
{
uint8_t temp[1]= {ch};
HAL_UART_Transmit(&huart1,temp,1,0xffff);
return 0;
}
然后打开串口2,串口2配置为串口中断和编写接收的代码。
开启串口中断
HAL_UART_Receive_IT(&huart2, (uint8_t *)&uart2_RxBuffer, 1);
保存串口中断接收数据的代码
其中USART2_RX_CNT是计数的功能。USART2_RX_OK是接收中断完成的标志。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2)
{
if(USART2_RX_CNT<USART2_MAX_RECV_LEN) //还可以接收数据
{
if(uart2_RxBuffer=='\r' )
{
USART2_RX_CNT=0; //标记接收完成
USART2_RX_OK=1;
}
else
USART2_RX_BUF[USART2_RX_CNT++]=uart2_RxBuffer; //记录接收到的值
} else
{
USART2_RX_OK=1;
USART2_RX_CNT=0; //强制标记接收完成
}
HAL_UART_Receive_IT(&huart2, &uart2_RxBuffer, 1);
}
}
2 配置串口转以太网模块
然后就是配置NT1/NT1-B 串口转以太网模块。看功能介绍还是比较多的。
将该模块通过网线接入到网络中,并通过串口调试。
连接的接口如下图所示,只需要接入tx和rx两个IO口就行。
然后,打开相关的配置软件,这里就不再赘述了,去官网下载“NT1&NT1-B用户上位机”就行。
点击绑定IP地址,然后点击搜索。就会出现设备列表了。点击列表中的设备,弹出配置界面了。
这里只需要配置TCP的服务器功能,端口配置为8887.
调试的时候需要打开串口调试助手和网络调试助手,这个在论坛搜索就行,有很多这种的软件。
当我们通过网络助手或者串口调试助手发送信息的时候,对方就能接收到数据的。
如果软件运行不方便,还可以通过http://192.168.0.107这个打开网页配置。
3.实现stm32的数据发送和接收
这里使用的是stm32f103最小系统,
并利用板载的PC13的LED口作为验证。在stm32cubemx配置PC13为输出。if (USART2_RX_OK==1)//接收到网络的指令
{
USART2_RX_OK=0;//标志位结束
printf("Get msg:%s",USART2_RX_BUF);
if(strstr((char *)USART2_RX_BUF,"LED0"))//LED0关闭LED
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
}
if(strstr((char *)USART2_RX_BUF,"LED1"))//LED1打开LED
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
}
}
这样就可以通过指令控制led的亮灭了。
|
得益于NT1/NT1-B 串口转以太网模块的强大功能,使用户无需关注网络层的实现,仅仅需要关注应用的实现,可以快速实现网络通信,方法简单高效。