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,主函数里写了个按键检测复位

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

posted on 2024-04-12 05:27  广源时代  阅读(115)  评论(0编辑  收藏  举报

导航

支付宝 QQ群