OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3179|回复: 3

stm32f407与lwip与can通讯

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2023-5-10
在线时间
1 小时
发表于 2023-5-17 15:34:33 | 显示全部楼层 |阅读模式
1金钱
想要利用lwip的netconn接口来实现与上位机的数据传输,用正点原子的例程,发现只能传输字符串,想要传输uint类型的数组就会在网络串口调试助手上显示乱码。代码如下:
/* 接收数据缓冲区 */
uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE];
/* 发送数据内容 */
//char *g_lwip_demo_sendbuf = "ALIENTEK DATA\r\n";
uint8_t g_lwip_demo_sendbuf[] = {1,2,3};


/* 数据发送标志位 */
uint8_t g_lwip_send_flag;
extern QueueHandle_t g_display_queue;     /* 显示消息队列句柄 */

/**
* @brief       lwip_demo实验入口
* @param       无
* @retval      无
*/
void lwip_demo(void)
{
    static struct netconn *tcp_clientconn = NULL; /* TCP CLIENT网络连接结构体 */
    uint32_t data_len = 0;
    struct pbuf *q;
    err_t err,recv_err;
    ip4_addr_t server_ipaddr,loca_ipaddr;
    static uint16_t server_port,loca_port;
    BaseType_t lwip_err;
    char *tbuf;

    server_port = LWIP_DEMO_PORT;
    IP4_ADDR(&server_ipaddr,DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3);   /* 构造目的IP地址 */

    tbuf = mymalloc(SRAMIN, 200); /* 申请内存 */
    sprintf((char *)tbuf, "ort:%d", LWIP_DEMO_PORT); /* 客户端端口号 */
    lcd_show_string(5, 150, 200, 16, 16, tbuf, BLUE);

    while (1)
    {
        tcp_clientconn = netconn_new(NETCONN_TCP);                                      /* 创建一个TCP链接 */
        err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);               /* 连接服务器 */

        if (err != ERR_OK)
        {
            printf("接连失败\r\n");
            netconn_delete(tcp_clientconn);                                             /* 返回值不等于ERR_OK,删除tcp_clientconn连接 */
        }
        else if (err == ERR_OK)                                                         /* 处理新连接的数据 */
        {
            struct netbuf *recvbuf;
            tcp_clientconn->recv_timeout = 10;
            netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1);                  /* 获取本地IP主机IP地址和端口号 */
            printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n",DEST_IP_ADDR0,DEST_IP_ADDR1, DEST_IP_ADDR2,DEST_IP_ADDR3,loca_port);
            lcd_show_string(5, 90, 200, 16, 16, "State:Connection Successful", BLUE);

            while (1)
            {
                if ((g_lwip_send_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA)                 /* 有数据要发送 */
                {

                    err = netconn_write(tcp_clientconn ,g_lwip_demo_sendbuf,strlen((char*)g_lwip_demo_sendbuf),NETCONN_COPY); /* 发送tcp_server_sentbuf中的数据 */

                    if (err != ERR_OK)
                    {
                        printf("发送失败\r\n");
                    }

                    g_lwip_send_flag &= ~LWIP_SEND_DATA;
                }

                if ((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)            /* 接收到数据 */
                {
                    taskENTER_CRITICAL();                                                               /* 进入临界区 */
                    memset(g_lwip_demo_recvbuf,0,LWIP_DEMO_RX_BUFSIZE);                      /* 数据接收缓冲区清零 */

                    for (q = recvbuf->p;q != NULL;q = q->next)                               /* 遍历完整个pbuf链表 */
                    {
                        /* 判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于 */
                        /* 的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据 */
                        if (q->len > (LWIP_DEMO_RX_BUFSIZE - data_len))
                        {
                            memcpy(g_lwip_demo_recvbuf + data_len,q->payload,(LWIP_DEMO_RX_BUFSIZE - data_len));/* 拷贝数据 */
                        }
                        else
                        {
                            memcpy(g_lwip_demo_recvbuf + data_len,q->payload,q->len);
                        }

                        data_len += q->len;

                        if (data_len > LWIP_DEMO_RX_BUFSIZE)
                        {
                            break;                  /* 超出TCP客户端接收数组,跳出 */
                        }
                    }
                    printf("接收到的数据为:%s\r\n", g_lwip_demo_recvbuf);

                    taskEXIT_CRITICAL();            /* 退出临界区 */
                    data_len = 0;                   /* 复制完成后data_len要清零 */

                    lwip_err = xQueueSend(g_display_queue,&g_lwip_demo_recvbuf,0);

                    if (lwip_err == errQUEUE_FULL)
                    {
                        printf("队列Key_Queue已满,数据发送失败!\r\n");
                    }

                    netbuf_delete(recvbuf);
                }
                else if (recv_err == ERR_CLSD)       /* 关闭连接 */
                {
                    netconn_close(tcp_clientconn);
                    netconn_delete(tcp_clientconn);
                    printf("服务器%d.%d.%d.%d断开连接\r\n",DEST_IP_ADDR0,DEST_IP_ADDR1, DEST_IP_ADDR2,DEST_IP_ADDR3);
                    lcd_fill(5, 89, lcddev.width,110, WHITE);
                    lcd_show_string(5, 90, 200, 16, 16, "Stateisconnect", BLUE);
                    myfree(SRAMIN, tbuf);
                    break;
                }
            }
        }
    }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2020-11-4
在线时间
121 小时
发表于 2023-5-18 09:27:32 | 显示全部楼层
应该是你err = netconn_write(tcp_clientconn ,g_lwip_demo_sendbuf,strlen((char*)g_lwip_demo_sendbuf),NETCONN_COPY); /* 发送tcp_server_sentbuf中的数据 */这句话的原因
其中的发送的长度strlen((char*)g_lwip_demo_sendbuf)的关系,你把网络调试助手接收改为HEX显示,把这里的长度改成定长,就显示正常了。
回复

使用道具 举报

16

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2020-11-4
在线时间
121 小时
发表于 2023-5-18 09:31:35 | 显示全部楼层
可以看看区别:
https://blog.csdn.net/zhaocx1112 ... 42273-null-null.142^v87^control_2,239^v2^insert_chatgpt&utm_term=sizeof&spm=1018.2226.3001.4187
回复

使用道具 举报

16

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2020-11-4
在线时间
121 小时
发表于 2023-5-18 09:45:37 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 13:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表