金牌会员
 
- 积分
- 2099
- 金钱
- 2099
- 注册时间
- 2017-2-11
- 在线时间
- 306 小时
|
50金钱
本帖最后由 jiangyy 于 2021-2-25 09:21 编辑
最近一直在开发STM32F207+DP83848+freertos,通讯模式是NETCONN_TCP 客户端。不多说了,先分享一下我的开发经验。目前已经调试OK,可以正常通讯。老化测试24H,没出现死机现象,可以正常运转。我使用的是动态IP自协商,配一个WIFI路由器,客户端和服务端均以网线连接到WIFI路由器,这样可以动态分配IP地址,同一个网关上运行。现在棘手的问题是,客户端网线短时间可以实现热插拔,但是长时间断开再连接网线,无法链接通讯。其次就是拔掉服务端网线再插上网线,必然无法链接通讯。求助资深网络高手指点迷津。下面是我STM32CUBE配置图:1.DP83848配置图1
2.DP83848配置图2
3.自协商开启
这个是使用动态分配地址
4.链接回调开启
这个是连接回调函数,能识别网线断开或者连接状态,你也可以理解为网线外部中断回调函数,这个是能实现热插拔的重要函数。
- _Bool ethConnectedFlag;
- extern struct netif gnetif;
- /* USER CODE END Header_StartETHConnectTask */
- void ethernetif_notify_conn_changed(struct netif *netif)
- {
- if(netif_is_link_up(netif))
- {
- netif_set_up(netif);
- dhcp_start(&gnetif);//如果使用静态IP地址,这个需要屏蔽掉
- }
- else
- {
- netif_set_down(netif);
- ethConnectedFlag = 0;
- }
- }
复制代码 void ethernetif_notify_conn_changed(struct netif *netif)这个回调函数在ethernetif.c文件里面,因为是弱函数,所以可以调用到 freertos.c文件使用。
5.创建网络连接任务
- void StartETHConnectTask(void const * argument)
- {
- /* USER CODE BEGIN StartETHConnectTask */
- /* Infinite loop */
- // struct netconn *conn;
- ip_addr_t serverIP;
- uint16_t serverPort = 8080;
- IP4_ADDR(&serverIP, 192, 168, 2, 8);
- conn = netconn_new(NETCONN_TCP);
- osDelay(2000);
- myerr = netconn_connect(conn, &serverIP, serverPort);
- for(;;)
- {
- if(myerr == ERR_OK)
- {
- ethConnectedFlag = 1;
- }
- else
- {
- ethConnectedFlag = 0;
- netconn_delete(conn);
- conn = netconn_new(NETCONN_TCP);
- myerr = netconn_connect(conn, &serverIP, serverPort);
- }
- osDelay(1000);
- }
复制代码 6.创建网络接收发送任务
- /* USER CODE BEGIN Header_StartETH_Task */
- /**
- * @brief Function implementing the ETH_Task thread.
- * [url=home.php?mod=space&uid=271674]@param[/url] argument: Not used
- * @retval None
- */
- /* USER CODE END Header_StartETH_Task */
- void StartETH_Task(void const * argument)
- {
- /* USER CODE BEGIN StartETH_Task */
- /* Infinite loop */
- struct netbuf *recvPack;
- uint8_t recvBuf[32] = {0};
- // uint8_t sendBuf[32] = {0};
- uint8_t len;
- for(;;)
- {
- if(ethConnectedFlag == 1)
- {
- if((myerr=netconn_recv(conn, &recvPack))==ERR_OK)
- {
- LED7_debug_Toggle();
- taskENTER_CRITICAL(); //关中断
- memset(recvBuf, 0, sizeof(recvBuf));
- if((recvPack->p->len) > 32)//超出缓存最大值
- {
- netbuf_delete(recvPack);
- }
- else
- {
- memcpy(recvBuf, recvPack->p->payload, recvPack->p->len);
- len = recvPack->p->len;
- netbuf_delete(recvPack);
- myerr = netconn_write(conn, recvBuf, len, 0);
- }
- taskEXIT_CRITICAL(); //开中断
- }
- }
- osDelay(1);
- }
- /* USER CODE END StartETH_Task */
- }
复制代码
现在可以正常通讯,短时间拔插客户端网线可以实现热插拔,但是长时间拔插客户端网线,就无法通讯。拔掉服务端网线,必然无法通讯。请求网络高手指点迷津。  
|
|