GY001-WiFi&BLE+4G转CAN总线或RS485中高速通信 - 4G通信CAN数据发送到UDP, GPS上传数据, 4G转CAN总线的1毫秒一帧通信测试,实际做到了微秒级速率
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/product/gy001_can_485.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节的功能是把接收的CAN数据发送到UDP, UDP接收的数据转发到CAN总线;
同时设备定时上报经纬度信息;
测试4G转CAN总线的1毫秒一帧通信测试完全没问题; 实际做到了微秒级, 具体多少微秒还未测试;
测试
1,设备准备工作
安装上4G天线;
如果支持GPS定位的设备需要连接GPS天线, 天线记得需要放到室外;
B/H接CAN总线 H; A/L接CAN总线 L;

2,把这节的工程放到开发环境下面的目录里面并解压!
把这节的工程放到开发环境下面的目录里面并解压!
把这节的工程放到开发环境下面的目录里面并解压!

3,然后右键选择通过 Code 打开

4,修改为自己服务器的IP地址和端口号,和CAN总线通信波特率


5,点击这个进行编译
提示: 第一次编译时间有点长, 编译完这一次后面再编译就快了

6,编译下载程序, 然后点击查看日志窗口

7, 4G联网成功, 并获取到了网络时间说明可以了

联网成功以后,设备的NET指示灯会循环 灭500ms, 然后快闪3下

8, 测试下设备接收到CAN数据以后发送到UDP
这边使用C#做了一个UDP接收客户端, 可以把客户端放到自己的服务器上, 如果是本机的话可以使用花生壳映射来做通信;
默认监听的端口是 60000


9, 现在说下这边定的协议规则
下面是发送的CAN数据, ID是 00 0F FF FF 数据是 00 00 00 00 00 00 00 00


UDP实际接收到的是
A5 A6 01 20 38 36 38 34 30 38 30 36 31 38 30 35 35 39 30 01 00 00 0F FF FF 08 00 00 00 00 00 00 00 00 55 56
A5 A6 是数据头;
01 是代表发送的是 CAN数据; 客户监控有可能也监控到 02, 这个代表是上报的GPS数据;
20 代表后面的数据个数 (32个数据);
38 36 38 34 30 38 30 36 31 38 30 35 35 39 30 是设备的IMEI 868408061805590 作为设备ID
01 代表扩展帧, 如果是标准帧则是00
00 代表数据帧, 如果是遥控帧则是01
00 0F FF FF 是帧ID
08 代表CAN数据有效数据长度
00 00 00 00 00 00 00 00 是固定8字节的数据
10, 测试下每隔1ms使用UDP发送数据给设备
格式: A5 A6 01 11 01 00 1F FF FF FF 08 01 02 03 04 05 06 07 08 55 56
和上面的整体格式一样,只是去掉了设备ID
我这边就选择1ms定时发

可以看到服务器上发送的条数和设备接收以后发到CAN总线的条数


11, 关于设备上报的GPS数据格式

A5 A6 02 19 38 36 38 34 30 38 30 36 31 38 30 35 35 39 30 66 A5 E3 42 F7 10 B6 41 55 56
A5 A6 是数据头;
02 是代表上报的GPS数据;
19 代表后面的数据个数 (25个数据);
38 36 38 34 30 38 30 36 31 38 30 35 35 39 30 是设备的IMEI 868408061805590 作为设备ID
66 A5 E3 42 是经度,113.823043(低位在前,高位在后) 这个是根据IEEE754规约 知识点参考链接 https://www.cnblogs.com/yangfengwu/p/12111552.html
F7 10 B6 41 是纬度,22.758283 (低位在前,高位在后)
程序说明
1,CAN初始化和创建CAN数据接收任务

2,在CAN接收任务中把CAN数据发送到UDP数据发送缓存

3,提取缓存的数据,通过UDP发送出去


4,等待4G联网成功以后,初始化UDP

UDP接收的数据发送到数据缓存

5,从缓存中提取UDP接收的数据, 提取CAN总线数据, 通过CAN发送

下面处理的方式是为了解决粘包和分包;


6,发送GPS数据是在这里


关于OTA升级
1,更改固件信息是在这里

GY001 代表板子型号; 中间的0000代表硬件版本,字符串随意规定; 最后的0.0.0 代表软件版本,总长度不得超过32字节
2,咱编译以后会生成build文件夹, 然后OTA升级文件是这个

3,升级方式1
可以直接在这里写上升级文件的http下载地址: http://xxxx/xxxx/audioCamera.bin

程序每次启动以后如果版本不一样会自动升级




4,升级方式2
用户可以把升级url地址调用下面的方式存储,然后软重启即可
软重启建议使用 sleep_time_gpio_wakeup(1); 这样不会影响内部时钟

5,升级方式3
如果客户想在程序运行中不重启直接升级, 客户可以直接把升级地址赋值给 ota_url
然后调用
if(struct_ota_task.runing == 0){
gy_ota_task_create(&struct_ota_task);
}
.
浙公网安备 33010602011771号