请教高手们用freertos+uart+cat.1要怎么架构比较合理呢?
要求uart使用中断收发,没有hal库和dma模式,能实现发送、终止发送、接收、终止接收,指定收发长度和接收超时时间cat.1要实现通过网络的连接,上行、下行等
freertos初学,不知道这样的应用要怎么架构 都跑freertos了 还要什么架构 ccc228 发表于 2023-10-23 08:26
都跑freertos了 还要什么架构
(引用自2楼)
就是要怎么框架比较合理 开5个TASK,uart收发两个,cat.1收发两个,另外一个处理常规逻辑 jbpan852 发表于 2023-10-23 09:13
开5个TASK,uart收发两个,cat.1收发两个,另外一个处理常规逻辑
(引用自4楼)
cat.1比如开/关, 查询网络状态,入网之类的,怎么进行分开控制呢? tang_qianfeng 发表于 2023-10-23 09:20
cat.1比如开/关, 查询网络状态,入网之类的,怎么进行分开控制呢?
(引用自5楼)
可以在处理常规逻辑的TASK中处理 jbpan852 发表于 2023-10-23 10:30
可以在处理常规逻辑的TASK中处理
(引用自6楼)
这样如果要将不定长参数传入某个任务,并要求有返回值,该怎么操作呢? 开几个TASK,当好几个并行的前后台系统用呗。该中断做的还是中断做,TASK相当于原来的main。 怎么合理的处理这些通信模组的URC是个大问题,可恶的AT指令 最近刚好也在用这个,我是用ESP32的USB口直接接4G模块的,就当成usb网卡用,这样比直接用串口AT命令方便很多,应用层的API,也能和wifi兼容。 如果想模组网络和命令分开,走USB通讯好的,不同的EP点管道功能划分,互不干扰 wx-ta 发表于 2023-10-23 10:40
怎么合理的处理这些通信模组的URC是个大问题,可恶的AT指令
(引用自9楼)
是的,感觉没有这么方便 yyts 发表于 2023-10-23 11:07
最近刚好也在用这个,我是用ESP32的USB口直接接4G模块的,就当成usb网卡用,这样比直接用串口AT命令方便很 ...
(引用自10楼)
理论上usb和uart应该差不多啊 linux里面select轮询基本可以完成9成业务逻辑,qt里面信号槽更爽更好用,单片机一般用状态机。 三年模拟 发表于 2023-10-23 12:11
linux里面select轮询基本可以完成9成业务逻辑,qt里面信号槽更爽更好用,单片机一般用状态机。 ...
(引用自14楼)
那任务之间怎么传递可变长度的参数,并且返回结果呢 了解一下freertos队列发送消息 划分好任务,每个任务开一个线程。线程间用消息队列通信。 fuu 发表于 2023-10-23 15:27
划分好任务,每个任务开一个线程。线程间用消息队列通信。
(引用自17楼)
怎么传递参数个数不定且参数类型不定的消息啊 就这点操作.裸机不香吗? 本帖最后由 fuu 于 2023-10-24 12:32 编辑
tang_qianfeng 发表于 2023-10-23 23:47
怎么传递参数个数不定且参数类型不定的消息啊
(引用自18楼)
struct packet
{
uint8_t type;
uint8_t len;
uint8_t *buf;
}
void uart_tx_thread_entry(void *parameter)
{
struct packet msg1;
struct packet msg2;
uint8_t buf1[]={1,2,3};
uint8_t buf2[]={'a','b','c'};
uart_rec_queue = xQueueCreate(10, 128);
msg1.type = TYPE1;
msg1.len = sizeof(buf1);
msg1.buf = buf1;
msg2.type = TYPE2;
msg2.len = sizeof(buf2);
msg2.buf = buf2;
while(1)
{
vTaskDelay(1000);//1s
xQueueSend(uart_rec_queue, &msg1, 0);
vTaskDelay(1000);//1s
xQueueSend(uart_rec_queue, &msg2, 0);
}
}
void uart_rx_thread_entry(void *parameter)
{
struct packet msg;
uint8_t buf;
while(1)
{
if(xQueueReceive(uart_rec_queue, &msg, portMAX_DELAY) == pdTRUE)
{
switch(msg.type)
{
case TYPE1:
memcpy(buf, msg.buf, msg.len);
break;
case TYPE2:
//code
break;
}
}
}
}
现敲的几行代码,大概是这个意思,传递结构体的首地址,接收端再复制到缓存处理 fuu 发表于 2023-10-24 12:29
现敲的几行代码,大概是这个意思,传递结构体的首地址,接收端再复制到缓存处理 ...
(引用自20楼)
明白,非常感谢 最近我们公司有个项目也要用freertos和使用at的cat1,我准备移植一个现成的at框架来处理,我找了两个,一起来测试测试啊{:lol:}
https://github.com/MinjunHuang/ATFram
https://blog.csdn.net/m0_37845735/article/details/123979583 diyeyuye 发表于 2023-10-24 22:28
最近我们公司有个项目也要用freertos和使用at的cat1,我准备移植一个现成的at框架来处理,我找了两个,一起 ...
(引用自22楼)
我也在看,另外freertos 串口收发你是怎么处理的? tang_qianfeng 发表于 2023-10-24 22:32
我也在看,另外freertos 串口收发你是怎么处理的?
(引用自23楼)
我是用的DMA接收到一个数组里,在串口的空闲中断里发送一个信号量,任务里面等待信号量,加上超时;准备后面使用队列替代全局数组 diyeyuye 发表于 2023-10-24 22:28
最近我们公司有个项目也要用freertos和使用at的cat1,我准备移植一个现成的at框架来处理,我找了两个,一起 ...
(引用自22楼)
那个rttherad的能下载分享一下吗?我无法下载csdn diyeyuye 发表于 2023-10-25 08:53
我是用的DMA接收到一个数组里,在串口的空闲中断里发送一个信号量,任务里面等待信号量,加上超时;准备 ...
(引用自24楼)
感觉用队列接收好麻烦,DMA接收怎么设置不定长的啊? tang_qianfeng 发表于 2023-10-25 08:55
那个rttherad的能下载分享一下吗?我无法下载csdn
(引用自25楼)
连接不能贴上来,你直接在 gitee 上搜索 at_device 的项目。 diyeyuye 发表于 2023-10-25 08:53
我是用的DMA接收到一个数组里,在串口的空闲中断里发送一个信号量,任务里面等待信号量,加上超时;准备 ...
(引用自24楼)
我的项目基本也是这样处理的,另外建一个大一点的FIFO,DMA接收到放到FIFO缓存里面,线程任务只需要判断FIFO有数据,就拿出来解析 tang_qianfeng 发表于 2023-10-25 08:56
感觉用队列接收好麻烦,DMA接收怎么设置不定长的啊?
(引用自26楼)
DMA配合空闲中断就可以实现不定长数据接收呢。 diyeyuye 发表于 2023-10-25 09:03
DMA配合空闲中断就可以实现不定长数据接收呢。
(引用自29楼)
就是如果有空闲中断就中止DMA的接收? tang_qianfeng 发表于 2023-10-25 09:08
就是如果有空闲中断就中止DMA的接收?
(引用自30楼)
是的,就是这么处理的。 diyeyuye 发表于 2023-10-25 09:10
是的,就是这么处理的。
(引用自31楼)
我用的mcu没有空闲中断。。。用定时器模拟?
另外gitee上没有搜到呢 jbpan852 发表于 2023-10-25 09:02
我的项目基本也是这样处理的,另外建一个大一点的FIFO,DMA接收到放到FIFO缓存里面,线程任务只需要判断F ...
(引用自28楼)
我没有用DMA, 如果有数据要接收,就打开中断接收,接收到指定长度数据就给个信号量
发送也一样,等发送完成也给个信号量
然后就是应用任务发送接收,发送,中止接收,中止发送的指令,另一个任务接收这些指令并控制串口的收发 提供一个实现思路:
1.串口数据接收使用DMA+空闲中断实现不定长数据接收+环形队列,每次空闲中断将数据加入队列并发送一个事件通知任务A及时处理数据;
2.开一个任务A用于接收中断发来的事件并对环形队列数据解析,将解析结果发送事件给任务B,解析到URC报文可以根据情况选择发送事件还是消息;
3.应用任务B:写一个状态机,包含模组初始化,联网流程,异常处理等;应用逻辑可以放在正常连接服务器这个状态下,这个状态下可以发送数据给服务器,也可以接收URC事件和消息;
4.AT指令的发送在任务B,发送指令后进入事件接收,等待任务A将指令响应事件发来,单指令有多个步骤的情况循环这个过程就可以,异常也是要处理好的,注意每个指令超时时间不一样,响应的报文可能有多条都要处理好;
5.设计一个AT指令的数据结构,包含指令内容,响应指令的多种情况,超时时间等,然后结合任务A数据解析程序来实现各种指令的适配;
MCU内存够用建议CMUX+PPPOS+LWIP,程序对各厂家的模组兼容性比较好,应用程序可移植性也高一些 752438771 发表于 2023-10-25 12:19
提供一个实现思路:
1.串口数据接收使用DMA+空闲中断实现不定长数据接收+环形队列,每次空闲中断将数据加 ...
(引用自34楼)
请教如果想要实现串口接收(并可以指定接收长度及超时时间),发送(并可指定发送长度),终止接收,终止发送等命令,要怎么样架构呢? 直接拿4G模组开发多省事, 直接用OpenCPU air700e,16元,直接CSDK 开发,还要什么自行车。 yerrmin 发表于 2023-10-26 21:30
直接用OpenCPU
(引用自37楼)
opencpu是啥 tang_qianfeng 发表于 2023-10-26 22:13
opencpu是啥
(引用自39楼)
模块可以二次开发,里面跑的就是RTOS。外部省一颗MCU, 没有烦人的AT指令,好用得很。
页:
[1]