3-WIFI&蓝牙(ESP32)转CAN或RS485总线&串口TTL模块-CSDK--设备作为TCP服务器,实现上位机TCP客户端和CAN之间的数据透传

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

 

说明

这节设备作为TCP服务器, 上位机TCP客户端发送的数据通过CAN总线输出;  设备从CAN总线接收的数据发送到TCP客户端;

 

测试

1,打开这节的工程

根据自己的需求配置模组的热点 或 模组连接的路由器 或 CAN总线波特率 或者 TCP服务器监听的端口号;

如果连接路由器推荐自己设置静态IP, 这样子直接就知道了设备的IP地址;

静态IP地址的子网掩码和默认网关可以参考局域网内的电脑上的; 最后静态IP地址最后一个是有范围的(取决于路由器DHCP范围),

首先地址的前三个 xxx.xxx.xxx  和局域网内的电脑上的一致, 最后一个可以在电脑数字的基础上加个1

我下面的是 192.168.168.1  那么我可以设置设备的为  192.168.1.2

 

 

 

设置完成以后把程序下载到设备

 

 

 

2,连接上CAN总线设备

 

3,我这边使用网络调试助手进行测试

关于设备的IP地址: 

如果连接设备的热点,那么IP地址填写 192.168.4.1

如果设备连接了路由器,也可以在设备串口上看到设备的IP地址;  推荐一开始的时候自己设置静态IP

 

 

 

 

 

 

4,如果接收到数据会显示

一帧数据是12字节, 前面4字节是帧ID,后面8字节数数据

 

5,发送数据

前面四字节是帧ID,后面8字节是数据

 

 

这边使用CAN分析仪接收的数据

 

程序说明

1,TCP服务器接收到客户端的数据就把数据通过CAN发送出去

 

 

    length = len;
    count=0;
    while (length!=0 && length%12==0) //粘包的时候处理粘包
    {
        //帧ID
        uint32_t canId=0;
        canId = tcpServer1Recv[0+count]; canId= canId<<8;
        canId = canId + tcpServer1Recv[1+count]; canId = canId<<8;
        canId = canId + tcpServer1Recv[2+count]; canId = canId<<8;
        canId = canId + tcpServer1Recv[3+count];

        /*发送CAN消息*/
        twai_message_t* twai_message = (twai_message_t*)malloc(sizeof(twai_message_t));
        if(twai_message != NULL )
        {
            memset(twai_message, 0, sizeof(twai_message_t));

            /*数据*/
            memcpy(twai_message->data, &tcpServer1Recv[4+count], 8);//拷贝数据
            twai_message->data_length_code = 8;//数据个数
            twai_message->extd=0;//0-标准帧; 1-扩展帧
            if (canId>0x7FF)//扩展帧
            {
                twai_message->extd=1;
            }
            
            twai_message->identifier = canId;//帧ID
            twai_message->rtr = 0;//0-数据帧; 1-远程帧
            /*把消息发送到消息队列*/
            if (xQueueSend(QueueHandleCanTransmit, &twai_message, 5/portTICK_PERIOD_MS) != pdPASS)
            {
                free(twai_message);
            }
        }


        count=count+12;
        length = length -12;
    }

 

 

2,通过CAN接收的数据发送给TCP客户端

 

                //接收的CAN报文发送到TCP客户端
                tcpServerTransmit_t* tcpServerTransmit = (tcpServerTransmit_t*)malloc(sizeof(tcpServerTransmit_t));
                if(tcpServerTransmit != NULL )
                {
                    uint8_t *p_data = (uint8_t *) malloc(12);//待发送数据的个数
                    p_data[0] = (twai_message.identifier>>24)&0xff;
                    p_data[1] = (twai_message.identifier>>16)&0xff;
                    p_data[2] = (twai_message.identifier>>8)&0xff;
                    p_data[3] = (twai_message.identifier>>0)&0xff;

                    memcpy(&p_data[4], twai_message.data, 8);//取8字节CAN数据

                    tcpServerTransmit->p_data = p_data;
                    tcpServerTransmit->data_len = 12;//发送数据的个数

                    for (size_t i = 0; i < 8; i++)//轮训TCP客户端
                    {
                        if (tcpServerClient[0][i].ts != NULL && tcpServerClient[0][i].ts->netconn_c !=NULL)//可用
                        {
                            //也可以再加上  tcpServerClient[0][i].data[0] 根据接收到的客户端数据进行选择
                            tcpServerTransmit->netconn_c = tcpServerClient[0][i].ts->netconn_c;
                            /*把消息发送到消息队列*/
                            if (xQueueSend(QueueHandleTcpServerTransmit, &tcpServerTransmit, pdMS_TO_TICKS(10)) != pdPASS)
                            {
                                free(tcpServerTransmit);
                                free(p_data);
                            }
                        }
                    }
                }

 

 

 

3,用户可以以1ms高频率发送CAN数据

下面是以1ms频率发送数据, 发送了5分钟,十分稳定

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

posted on 2024-04-13 21:52  广源时代  阅读(104)  评论(0编辑  收藏  举报

导航

支付宝 QQ群