[STM32F1]如何使用stm32快速建立tcp和udp连接?

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的亮灭了。


[attach]2206430[/attach]

14.jpg

---------------------
作者:51xlf
链接:https://bbs.21ic.com/icview-3351334-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在STM32F4系列微控制器上使用Socket库来建立UDP(User Datagram Protocol)连接非常简单和方便。以下是一个简单的步骤说明: 1. 首先,我们需要在工程中添加相应的库文件,在使用Socket库之前,请确保已经添加了一个网络库,例如LwIP(Lightweight IP)库。 2. 接下来,我们需要创建一个UDP套接字,使用Socket库的`socket()`函数来实现。该函数返回一个套接字描述符,可用于之后的操作。 3. 设置套接字的属性,包括IP地址和端口号。这些属性将用于建立网络连接和通信。 4. 使用`bind()`函数将套接字与本地IP地址和端口号绑定。 5. 可选地,可以使用`setsockopt()`函数设置套接字选项,例如超时时间等。 6. 使用`sendto()`函数向特定的远程IP地址和端口发送数据。 7. 使用`recvfrom()`函数从特定的远程IP地址和端口接收数据。 8. 最后,使用`closesocket()`函数关闭套接字。 需要注意的是,STM32F4系列微控制器上的Socket库可能有特定的函数命名和参数,具体的使用方式可以参考相关的文档和示例代码。此外,在使用Socket库之前,还需配置正确的网络设置,确保硬件能够正确连接到网络。 总之,使用Socket库在STM32F4系列微控制器上建立UDP连接是非常简单和快速的,只需几个简单的函数调用即可完成手动建立和管理UDP连接。这样,我们可以在STM32F4上实现可靠的网络通信,以实现各种应用场景,如传感器数据采集和远程监控等。 ### 回答2: 使用STM32F4建立UDP连接可以通过以下步骤实现: 1. 配置网络参数:根据需要配置STM32F4板上的网络参数,包括IP地址、子网掩码、网关等。 2. 初始化通信模块:使用HAL库中的函数,例如`HAL_ETH_Init()`或`HAL_ETH_MspInit()`,来初始化以太网模块,确保模块能够正常工作。 3. 创建UDP套接字:使用`socket()`函数创建UDP套接字,并指定协议参数和端口号。例如,`socket(AF_INET, SOCK_DGRAM, 0);` 4. 绑定本地端口:使用`bind()`函数将UDP套接字与本地端口绑定。例如,`bind(sock, (struct sockaddr*)&local_addr, sizeof(local_addr));` 5. 设置远程IP地址和端口:使用`connect()`函数设置远程IP地址和端口,所有通过套接字发送的数据将会发送到这个远程地址。例如,`connect(sock, (struct sockaddr*)&remote_addr, sizeof(remote_addr));` 6. 发送数据:使用`sendto()`函数发送数据。例如,`sendto(sock, send_buf, send_buf_len, 0, (struct sockaddr*)&remote_addr, sizeof(remote_addr));` 7. 接收数据:使用`recvfrom()`函数接收数据,并指定存储接收数据的缓冲区和最大接收字节数。例如,`recvfrom(sock, recv_buf, MAX_RECV_BUF_SIZE, 0, (struct sockaddr*)&remote_addr, &addr_len);` 8. 关闭套接字:使用`close()`函数关闭套接字。例如,`close(sock);` 通过以上步骤,可以在STM32F4上建立一个UDP连接并实现数据的发送和接收。需要根据实际情况进行相应的参数配置,确保网络设置正确以及套接字的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值