tang_qianfeng 发表于 2023-10-22 23:57:45

请教高手们用freertos+uart+cat.1要怎么架构比较合理呢?

要求uart使用中断收发,没有hal库和dma模式,能实现发送、终止发送、接收、终止接收,指定收发长度和接收超时时间
cat.1要实现通过网络的连接,上行、下行等
freertos初学,不知道这样的应用要怎么架构

ccc228 发表于 2023-10-23 08:26:16

都跑freertos了 还要什么架构

tang_qianfeng 发表于 2023-10-23 08:47:06

ccc228 发表于 2023-10-23 08:26
都跑freertos了 还要什么架构
(引用自2楼)

就是要怎么框架比较合理

jbpan852 发表于 2023-10-23 09:13:50

开5个TASK,uart收发两个,cat.1收发两个,另外一个处理常规逻辑

tang_qianfeng 发表于 2023-10-23 09:20:02

jbpan852 发表于 2023-10-23 09:13
开5个TASK,uart收发两个,cat.1收发两个,另外一个处理常规逻辑
(引用自4楼)

cat.1比如开/关, 查询网络状态,入网之类的,怎么进行分开控制呢?

jbpan852 发表于 2023-10-23 10:30:44

tang_qianfeng 发表于 2023-10-23 09:20
cat.1比如开/关, 查询网络状态,入网之类的,怎么进行分开控制呢?
(引用自5楼)

可以在处理常规逻辑的TASK中处理

tang_qianfeng 发表于 2023-10-23 10:35:37

jbpan852 发表于 2023-10-23 10:30
可以在处理常规逻辑的TASK中处理
(引用自6楼)

这样如果要将不定长参数传入某个任务,并要求有返回值,该怎么操作呢?

Trylin 发表于 2023-10-23 10:38:05

开几个TASK,当好几个并行的前后台系统用呗。该中断做的还是中断做,TASK相当于原来的main。

wx-ta 发表于 2023-10-23 10:40:33

怎么合理的处理这些通信模组的URC是个大问题,可恶的AT指令

yyts 发表于 2023-10-23 11:07:54

最近刚好也在用这个,我是用ESP32的USB口直接接4G模块的,就当成usb网卡用,这样比直接用串口AT命令方便很多,应用层的API,也能和wifi兼容。

fengyuganyu 发表于 2023-10-23 11:46:09

如果想模组网络和命令分开,走USB通讯好的,不同的EP点管道功能划分,互不干扰

tang_qianfeng 发表于 2023-10-23 12:03:47

wx-ta 发表于 2023-10-23 10:40
怎么合理的处理这些通信模组的URC是个大问题,可恶的AT指令
(引用自9楼)

是的,感觉没有这么方便

tang_qianfeng 发表于 2023-10-23 12:05:41

yyts 发表于 2023-10-23 11:07
最近刚好也在用这个,我是用ESP32的USB口直接接4G模块的,就当成usb网卡用,这样比直接用串口AT命令方便很 ...
(引用自10楼)

理论上usb和uart应该差不多啊

三年模拟 发表于 2023-10-23 12:11:35

linux里面select轮询基本可以完成9成业务逻辑,qt里面信号槽更爽更好用,单片机一般用状态机。

tang_qianfeng 发表于 2023-10-23 12:23:12

三年模拟 发表于 2023-10-23 12:11
linux里面select轮询基本可以完成9成业务逻辑,qt里面信号槽更爽更好用,单片机一般用状态机。 ...
(引用自14楼)

那任务之间怎么传递可变长度的参数,并且返回结果呢

jbpan852 发表于 2023-10-23 12:37:45

了解一下freertos队列发送消息

fuu 发表于 2023-10-23 15:27:10

划分好任务,每个任务开一个线程。线程间用消息队列通信。

tang_qianfeng 发表于 2023-10-23 23:47:53

fuu 发表于 2023-10-23 15:27
划分好任务,每个任务开一个线程。线程间用消息队列通信。
(引用自17楼)

怎么传递参数个数不定且参数类型不定的消息啊

sweet_136 发表于 2023-10-24 08:23:58

就这点操作.裸机不香吗?

fuu 发表于 2023-10-24 12:29:31

本帖最后由 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;
                        }
                }
        }
}

现敲的几行代码,大概是这个意思,传递结构体的首地址,接收端再复制到缓存处理

tang_qianfeng 发表于 2023-10-24 13:34:43

fuu 发表于 2023-10-24 12:29
现敲的几行代码,大概是这个意思,传递结构体的首地址,接收端再复制到缓存处理 ...
(引用自20楼)

明白,非常感谢

diyeyuye 发表于 2023-10-24 22:28:33

最近我们公司有个项目也要用freertos和使用at的cat1,我准备移植一个现成的at框架来处理,我找了两个,一起来测试测试啊{:lol:}

https://github.com/MinjunHuang/ATFram

https://blog.csdn.net/m0_37845735/article/details/123979583

tang_qianfeng 发表于 2023-10-24 22:32:47

diyeyuye 发表于 2023-10-24 22:28
最近我们公司有个项目也要用freertos和使用at的cat1,我准备移植一个现成的at框架来处理,我找了两个,一起 ...
(引用自22楼)

我也在看,另外freertos 串口收发你是怎么处理的?

diyeyuye 发表于 2023-10-25 08:53:46

tang_qianfeng 发表于 2023-10-24 22:32
我也在看,另外freertos 串口收发你是怎么处理的?
(引用自23楼)

我是用的DMA接收到一个数组里,在串口的空闲中断里发送一个信号量,任务里面等待信号量,加上超时;准备后面使用队列替代全局数组

tang_qianfeng 发表于 2023-10-25 08:55:06

diyeyuye 发表于 2023-10-24 22:28
最近我们公司有个项目也要用freertos和使用at的cat1,我准备移植一个现成的at框架来处理,我找了两个,一起 ...
(引用自22楼)

那个rttherad的能下载分享一下吗?我无法下载csdn

tang_qianfeng 发表于 2023-10-25 08:56:41

diyeyuye 发表于 2023-10-25 08:53
我是用的DMA接收到一个数组里,在串口的空闲中断里发送一个信号量,任务里面等待信号量,加上超时;准备 ...
(引用自24楼)

感觉用队列接收好麻烦,DMA接收怎么设置不定长的啊?

diyeyuye 发表于 2023-10-25 09:02:30

tang_qianfeng 发表于 2023-10-25 08:55
那个rttherad的能下载分享一下吗?我无法下载csdn
(引用自25楼)

连接不能贴上来,你直接在 gitee 上搜索 at_device 的项目。

jbpan852 发表于 2023-10-25 09:02:34

diyeyuye 发表于 2023-10-25 08:53
我是用的DMA接收到一个数组里,在串口的空闲中断里发送一个信号量,任务里面等待信号量,加上超时;准备 ...
(引用自24楼)

我的项目基本也是这样处理的,另外建一个大一点的FIFO,DMA接收到放到FIFO缓存里面,线程任务只需要判断FIFO有数据,就拿出来解析

diyeyuye 发表于 2023-10-25 09:03:16

tang_qianfeng 发表于 2023-10-25 08:56
感觉用队列接收好麻烦,DMA接收怎么设置不定长的啊?
(引用自26楼)

DMA配合空闲中断就可以实现不定长数据接收呢。

tang_qianfeng 发表于 2023-10-25 09:08:58

diyeyuye 发表于 2023-10-25 09:03
DMA配合空闲中断就可以实现不定长数据接收呢。
(引用自29楼)

就是如果有空闲中断就中止DMA的接收?

diyeyuye 发表于 2023-10-25 09:10:38

tang_qianfeng 发表于 2023-10-25 09:08
就是如果有空闲中断就中止DMA的接收?
(引用自30楼)

是的,就是这么处理的。

tang_qianfeng 发表于 2023-10-25 09:11:53

diyeyuye 发表于 2023-10-25 09:10
是的,就是这么处理的。
(引用自31楼)

我用的mcu没有空闲中断。。。用定时器模拟?
另外gitee上没有搜到呢

tang_qianfeng 发表于 2023-10-25 09:16:42

jbpan852 发表于 2023-10-25 09:02
我的项目基本也是这样处理的,另外建一个大一点的FIFO,DMA接收到放到FIFO缓存里面,线程任务只需要判断F ...
(引用自28楼)

我没有用DMA, 如果有数据要接收,就打开中断接收,接收到指定长度数据就给个信号量
发送也一样,等发送完成也给个信号量

然后就是应用任务发送接收,发送,中止接收,中止发送的指令,另一个任务接收这些指令并控制串口的收发

752438771 发表于 2023-10-25 12:19:52

提供一个实现思路:

1.串口数据接收使用DMA+空闲中断实现不定长数据接收+环形队列,每次空闲中断将数据加入队列并发送一个事件通知任务A及时处理数据;

2.开一个任务A用于接收中断发来的事件并对环形队列数据解析,将解析结果发送事件给任务B,解析到URC报文可以根据情况选择发送事件还是消息;

3.应用任务B:写一个状态机,包含模组初始化,联网流程,异常处理等;应用逻辑可以放在正常连接服务器这个状态下,这个状态下可以发送数据给服务器,也可以接收URC事件和消息;

4.AT指令的发送在任务B,发送指令后进入事件接收,等待任务A将指令响应事件发来,单指令有多个步骤的情况循环这个过程就可以,异常也是要处理好的,注意每个指令超时时间不一样,响应的报文可能有多条都要处理好;

5.设计一个AT指令的数据结构,包含指令内容,响应指令的多种情况,超时时间等,然后结合任务A数据解析程序来实现各种指令的适配;

MCU内存够用建议CMUX+PPPOS+LWIP,程序对各厂家的模组兼容性比较好,应用程序可移植性也高一些

tang_qianfeng 发表于 2023-10-26 16:57:21

752438771 发表于 2023-10-25 12:19
提供一个实现思路:

1.串口数据接收使用DMA+空闲中断实现不定长数据接收+环形队列,每次空闲中断将数据加 ...
(引用自34楼)

请教如果想要实现串口接收(并可以指定接收长度及超时时间),发送(并可指定发送长度),终止接收,终止发送等命令,要怎么样架构呢?

snowy 发表于 2023-10-26 20:14:04

直接拿4G模组开发多省事,

yerrmin 发表于 2023-10-26 21:30:56

直接用OpenCPU

yc2 发表于 2023-10-26 21:45:29

air700e,16元,直接CSDK 开发,还要什么自行车。

tang_qianfeng 发表于 2023-10-26 22:13:15

yerrmin 发表于 2023-10-26 21:30
直接用OpenCPU
(引用自37楼)

opencpu是啥

yc2 发表于 2023-10-26 22:26:21

tang_qianfeng 发表于 2023-10-26 22:13
opencpu是啥
(引用自39楼)

模块可以二次开发,里面跑的就是RTOS。外部省一颗MCU, 没有烦人的AT指令,好用得很。
页: [1]
查看完整版本: 请教高手们用freertos+uart+cat.1要怎么架构比较合理呢?