<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN" width="100%"></iframe>
说明
这节设备作为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客户端
3,用户可以以1ms高频率发送CAN数据
下面是以1ms频率发送数据, 发送了5分钟,十分稳定
.
标签:IP地址,WIFI,twai,TCP,串口,message,数据,设备 From: https://www.cnblogs.com/yangfengwu/p/18133435