2120|2

36

帖子

1

TA的资源

一粒金砂(中级)

HC32F4A0-LwIP应用之TCP串口服务器 [复制链接]

HC32F4A0_FreeRTOS_LwIP移植 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

        上篇,已经移植了LwIP,并且成功Ping通。本篇,我们开始运用LwIP的Netconn API接口,最终实现TCP串口服务器。

        首先,我们先实现TCP回显服务器。功能如下,在HC32F4A0所在的板子上创建TCP服务器,PC机使用网络调试助手,发送任意数据,服务器回送该数据。由于,前两篇已经实现FreeRTOS和LwIP的移植,现在直接创建TCP服务器任务和编写回显服务器。

        先使用struct netconn结构体,创建全局指针变量,*tcpconn和*newconn,tcpconn是用来创建新的连接,连接类型可以为TCP或UDP,这里我们选TCP。newconn用来存放侦听到的新的连接。总体步骤为 创建连接-->绑定端口-->进入侦听状态-->等待新的连接。新的TCP客户端连接上后,进入一个循环,在这个循环中,我们以阻塞的方式等待数据,当有数据时,调用netbuf_data函数将数据取出来,进行相应的操作。以下是TCP回显服务器的代码:

/**************************************************************
  * [url=home.php?mod=space&uid=32621]@name[/url] xTaskTcpServer
  * [url=home.php?mod=space&uid=159083]@brief[/url] * @param   pvParameters: [输入/出] 
  * @retval
  * [url=home.php?mod=space&uid=1315547]@author[/url] Zachary
  * [url=home.php?mod=space&uid=34591]@data[/url] 2023-03-27
 **************************************************************/
uint8_t vlist = 0x0;
static void xTaskTcpServer( void *pvParameters )
{
    err_t err = ERR_OK;
	struct netbuf *recvbuf;
	void *data = NULL;
	uint16_t len = 0;
    
    tcpconn = netconn_new( NETCONN_TCP );
    netconn_bind( tcpconn, IPADDR_ANY, 5000 );
    netconn_listen( tcpconn );

    for( ;; )
    {
        err = netconn_accept( tcpconn, &newconn );
        
        char *DispChar = NULL;
        LCD_ShowString( 10, 370, lcddev.width, lcddev.height, 24, ( uint8_t * )"Tcp Client is Connected...", WHITE, BLACK );
        LCD_ShowString( 10, 400, lcddev.width, lcddev.height, 24, ( uint8_t * )"Receive:", WHITE, BLACK );
        if( err == ERR_OK )
        {
			for( ;; )
			{
				if( ( err = netconn_recv( newconn, &recvbuf ) ) == ERR_OK )
                {
                    do
                    {
                        netbuf_data( recvbuf, &data, &len );
                        netconn_write( newconn, data, len, NETCONN_COPY );
                        DispChar = ( char * )malloc( len );
                        memcpy( DispChar, data, len );
                        if( vlist >= 5 )
                        {
                            vlist = 0;
                            LCD_ShowString( 106, 400 + 0 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                            LCD_ShowString( 106, 400 + 1 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                            LCD_ShowString( 106, 400 + 2 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                            LCD_ShowString( 106, 400 + 3 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                            LCD_ShowString( 106, 400 + 4 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                            LCD_ShowString( 106, 400 + 5 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                            LCD_ShowString( 106, 400, lcddev.width, lcddev.height, 24, ( uint8_t * )DispChar, WHITE, BLACK );
                        }
                        else
                        {
                            LCD_ShowString( 106, 400 + vlist * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )DispChar, WHITE, BLACK );
                        }
                        vlist++;
                    } while( netbuf_next( recvbuf ) >= 0 );
                    
                    netbuf_delete( recvbuf );
                    free( DispChar );
                }
				else
				{
//__RS232_SVR_DESTROY:
					netconn_close( newconn );
					while( ERR_OK != netconn_delete( newconn ) )
					{
						vTaskDelay( 1 );
					}
                    vlist = 0;
                    LCD_ShowString( 10, 370, lcddev.width, lcddev.height, 24, ( uint8_t * )"Tcp Client is Closed...   ", WHITE, BLACK );
                    LCD_ShowString( 10, 400, lcddev.width, lcddev.height, 24, ( uint8_t * )"        ", WHITE, BLACK );
                    LCD_ShowString( 106, 400 + 0 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                    LCD_ShowString( 106, 400 + 1 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                    LCD_ShowString( 106, 400 + 2 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                    LCD_ShowString( 106, 400 + 3 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                    LCD_ShowString( 106, 400 + 4 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                    LCD_ShowString( 106, 400 + 5 * 24, lcddev.width, lcddev.height, 24, ( uint8_t * )"                         ", WHITE, BLACK );
                    break;
				}
			}
		}
		vTaskDelay( 10 );
    }
}

实验现象:

TcpServer

工程源码:

HC32F4A0_LwIP_Tcp_Server.7z (1.86 MB, 下载次数: 28, 售价: 2 分芯积分)

最新回复

谢谢老哥的分享,但是我这跑你的文件一直会进xQueueSemaphoreTake函数的configASSERT( ( pxQueue ) ),老哥知道原因吗。二值信号量这些都没动   详情 回复 发表于 2023-11-14 16:11

回复
举报

6507

帖子

0

TA的资源

五彩晶圆(高级)

在HC32F4A0所在的板子上创建TCP服务器,这个看起来有点难度

谢谢分享


回复

2

帖子

0

TA的资源

一粒金砂(初级)

谢谢老哥的分享,但是我这跑你的文件一直会进xQueueSemaphoreTake函数的configASSERT( ( pxQueue ) ),老哥知道原因吗。二值信号量这些都没动


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表