2-WIFI&蓝牙(ESP32)转CAN或RS485总线&串口TTL模块-CSDK--二次开发工程模板介绍(wifi配置;串口;CAN总线,高并发TCP服务器,多路TCP客户端)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
为了便于用户开发,提供了一个工程模板给用户,已经做好的功能及特点:
WiFi: 配置WiFi作为AP模式; STA模式; 设置静态IP; 获取连接路由器的状态; 获取到连接的路由器信息,和模组分配的IP地址
UART: 摒弃了乐鑫提供的示例, 直接底层中断取数据存储到环形队列,以通知的形式告知任务进行处理; 可以以1ms间隔速度传输数据;
CAN: 支持12.5K 到 1M 之间的波特率;
TCP服务器: 可以自由创建8路TCP服务器,每个服务器又可以最大支持8路客户端连接; 同时支持高并发,每一路都可以进行大数据量收发
TCP客户端: 可以自由创建12路TCP客户端,每个客户端同时支持高并发,每一路都可以进行大数据量收发
把工程拷贝进自己的IDF目录
1,把工程放到和hello_world同一级目录,然后解压
2,使用vscode打开
第一次使用,先点击这个清理下工程
然后再点击编译
提示: 第一次编译时间有点长, 编译完这一次后面再编译就快了
3,所有的默认配置都在 parameConfig
实际上所有的配置都可以做动态配置, 便于以后使用上位机等进行配置
在初始化的时候先加载默认配置
后面接着会从存储里面再重新配置, 当前只是写了个简单的测试, 随着用户的需求将会渐渐增加对应的动态配置
测试串口
1,咱们就使用下面两个口做测试
IO21 和 IO22是通用输入输出IO口,既可以做开关量输入(最高支持24V), 也可以做uart,IIC等
2,把程序下载到设备
注意:因为封装的功能都在全部运行,所以功耗大,测试时最好外接电源适配器给设备供电;
配置的IO21为TX; IO22为RX 波特率设置的 9600
程序上是接收到什么就返回什么; 提供了两种发送数据的形式,推荐使用下面的任务加队列方式(如果用户想使用 xQueueCreate, 可参考CAN总线发送数据例子)
3,这边使用串口模块连接设备进行测试,因为摒弃了乐鑫的例子,自己直接写的底层处理,所以效率非常高
这边先使用串口调试助手发送1字节数据进行测试,看下收发延迟, 时间相差5ms
实际上还需要去掉一字节数据的实际传输时间; 以9600波特率发送完一个字节数据需要1.04ms左右, 然后再回来需要1.04ms左右, 其实,延迟也就不到3ms
下面是使用逻辑分析仪抓取的信号, 实际延迟为2.82ms左右, 在跑操作系统的状态下这已经是顶峰了,毕竟操作系统需要任务切换
然后再测试大数据量, 这边使用串口调试助手每隔1ms发送100字节数据进行测试
这边使用串口调试助手每隔1ms发送1000字节数据进行测试, 注意由于是9600波特率, 所以调试助手发送完1000字节也需要1S多,所以才会看着卡
这里可以修改串口缓存大小
4,接收数据
提取数据的时候后面的len可以提取任意个, 这样子判断处理粘包和分包就非常方便了
测试串口RS485(无论用户使用的是否是RS485设备,也建议看下这个)
1,当前设备CAN和RS485共用引脚,测试时把CAN的使能标志设置为 0
2,程序也是接收什么就返回什么
2,这边也是连接调试模块进行测试
3,测试的时候如果定时发送间隔太短会发现回复的有乱码,其实是因为由于程序处理效率高
只要检测到缓存里面有接收的数据了就往外发了, 485那个线上还在来数据呢, 这边就往外发了,所以485线的数据就乱了
为了解决这个问题我在底层做了处理, 用户可以在判断上加上 && NotifyValue<=1 (NotifyValue<=1的时候意味着串口空闲中断来了,底层接收完一帧数据了)
空闲检测时间也是可以更改的, 这个时间是传输多少个11bit位的时间
现在波特率是9600, 也就是 1/9600≈0.1ms 传输 1bit, 下面空闲写的2, 也就是UART线超过 2*0.1*11≈2.2 ms 都没有接收数据了,就认为接收到了一帧数据,产生空闲中断
当然测试的时候时间也不能太短, 毕竟把数据传过去以后,设备接收然后还有数据返回时间
假设下面的传输10字节数据, 发送出去大概需要 11ms, 传过来需要11ms 所以无论如何都先固定有 22ms 传输时间
程序上处理数据只需要2.2+2.8= 5ms (空闲检测需要 2.2ms, 系统处理 2.8ms左右)
整个数据来回理想状态传输完需要 27ms左右 , 如果小于27ms定时发送10字节数据,那肯定不行, 就会出现在发送的时候同时在接收,就会出现乱码 ;
当然理想状态很难,毕竟跑系统, 所以再加个5,6ms;
提示:实际应用中其实各个上位机(modbus等都知道这个事情),会自动的增加本身数据传输时间来确保数据传输的稳定性;这边只是了解就可以;
测试CAN
1,当前设备CAN和RS485共用引脚,测试时把RS485的使能标志设置为 0 CAN使能设置为 1
可以根据自己的CAN设备更改波特率, 现在设置的是250K
2,默认提供了一个循环发送CAN数据例子
3,这边连接了CAN测试仪进行测试
4,CAN接收数据的地方
测试WiFi
1,用户可以根据自己的需求进行配置
2,如果需要获取连接路由器状态, 连接的路由器信息或者自身分配的IP地址等信息
提示
默认模组最大只能建立10个socket(tcp server + tcp client + udp), 在堆足够的情况下可根据自己的情况增加;
esp_get_free_heap_size() 可以获取实时的堆剩余大小(字节)
测试设备作为TCP 服务器
1,当前可以测试设备开两路TCP 服务器, 每路服务器可以支持8路客户端
注意:受上面10路socket的限制, 两个TCP服务器已经占了两个socket了; 还剩下8个socket分配到两个TCP服务器
第一路监听的端口号是 8888 第二路监听的端口号是 8889
2,如果需要多路则使能, 注意需要设置不同的监听端口
注意注意: 当前只写了两路服务器的对应的回调函数,如果需要多路则需要再添加
这里有例子, 例子上是接收到数据就返回数据
3,测试方式有两种
一个是咱电脑连接设备的热点, 设备自身默认的IP地址是:192.168.4.1
另一种方式是让设备和咱电脑同在一个路由器下,设备的IP地址呢就由路由器分配了, 有经验的用户也可以在下面设置下设备的静态IP;
我这边就直接连接设备的热点进行测试, 如果客户是连接路由器进行局域网测试,下面也会说明连接路由器的方式
4,把程序下载到设备,然后打开串口监控助手
如果用户使用路由器测试的话,这里会打印设备的IP地址
5,打开网络调试助手
我这边是连接的设备的热点,所以IP地址填写的是设备自身的IP
如果用户使用路由器测试的话,填写上面设备连接路由器后分配的IP
6,可以测试下轮训1ms发送2000~3000字节的数据,来验证设备的处理速度
7,多创建几个客户端; 每个客户端都轮训1ms发送2000~3000字节的数据,来验证设备的高并发
8,补充说明
这里还有记录客户端
下面还提供了如果在别的地方(串口接收,CAN数据接收等) 发送数据给客户端的例子
还可以指定地址
测试设备作为TCP 客户端
1,为了便于测试,咱让设备连接路由器
2,我这边使用调试助手创建个服务器
3,服务器地址和端口号根据自己的改, 我这边电脑地址是 192.168.168.1, 然后服务器端口号是 6000
注意,如果需要打开10路, 受上面最大10路socket限制, 所以记得把上面的TCP服务器功能关掉, 可以先试着打开8路
4,编译下载以后,助手上会显示连接
然后就可以1ms进行测试
5,程序上也是接收到数据就返回
GPIO示例
1,主函数里写了个按键检测复位
.