硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5829|回复: 7
收起左侧

[FreeRTOS] 请教版主,FREERTOS从6个串口分别接收不同的长度的数据然后控制4个外部设备,采用何

[复制链接]

13

主题

56

回帖

95

积分

初级会员

积分
95
发表于 2017-4-21 17:24:18 | 显示全部楼层 |阅读模式
版主:

    我有6个串口(使用的单片机为F407),要分别读取不同长度的数据,控制4个外部设备。
          串口1的数据长度固定为20个字节,串口2的数据长度固定为30个字节
          串口3的数据长度不固定(有可能是25个字节,也可能是60个字节,也可能是120字节),串口4的的数据长度不固定(有可能是30个字节,也可能是50个字节,也可能是120字节)
          串口5的数据长度不固定,串口6的数据长度也不固定。

     (1)、串口1的数据和串口2的数据控制外部设备1  --------------------->
     (2)、串口3的数据和串口4的数据控制外部设备2 --------------------->
     (3)、串口5的数据和串口6的数据控制外部设备3
     (4)、串口1的数据和串口3的数据和串口5的数据和串口6的数据送到外部设备4(显示器)用于显示。


     我的设想是:
            1.每个串口规划1个任务,接收到1个字节应用消息队列通知相应的任务,在任务中处理数据。
            2、但是4个外部设备和上述6个串口任务之间如何规划任务间的通信呢?
我是新手,请多多关照。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2017-4-21 17:26:58 | 显示全部楼层
我原先使用前后台方式编程,定义好全局变量后,只要确保数据的完整性就可以啦,但是FREERTOS下编程需要用消息队列发送数据,就不能随意使用变量啦。
我是新手,请多多关照。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2017-4-21 18:12:26 | 显示全部楼层
是不是直接创建4个设备任务更方便些。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2017-4-21 20:10:20 | 显示全部楼层

回 eric2013 的帖子

eric2013:是不是直接创建4个设备任务更方便些。 (2017-04-21 18:12) 
由于有6个串口,因此每个串口规划1个任务,共计规划6个任务,分别处理各自串口的通信数据。

     但是4个外部设备中,串口1的数据和串口2的数据控制外部设备1,

     请问如何将串口1的数据和串口2的数据通过FREERTOS通信方式将数据传输给外部设备1的任务呢?
我是新手,请多多关照。
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2017-4-22 08:47:11 | 显示全部楼层
其实你可把UART封装成一个独立的驱动设备,每个设备处理不同的数据就行了,给个数据结构你参考一下
typedef enum{

    SERIAL_NONE,                                                //未初始化
    SERIAL_IDLE,                                                //空闲
    SERIAL_BUSY,                                                //正在发送或接收数据
    SERIAL_DONE                                                //串口有新的数据
}SERIAL_STATUS;

//串口属性结构体
typedef struct
{
    USART_TypeDef    *pUSART;                        //串口设备
    SERIAL_STATUS txStatus;
    SERIAL_STATUS rxStatus;
    int16u_t              readIndex;                    //读数据计数
    int16u_t             saveIndex;                    //接收数据计数
    int8u_t              buffer[SERIAL_BUFF_SIZE];
    int8u_t              frameTimeOut;                //帧超时时间,单位ms
    int8u_t             charaTimeOut;                //字节超时时间,单位ms
    void                      (*pFunctionRS485) (int8u_t s);    //RS485回调函数   
    xSemaphoreHandle xSemaISR;                //二值信号量
}SERIAL;
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117542
QQ
发表于 2017-4-22 09:55:46 | 显示全部楼层

回 ba_wang_mao 的帖子

ba_wang_mao:由于有6个串口,因此每个串口规划1个任务,共计规划6个任务,分别处理各自串口的通信数据。

     但是4个外部设备中,串口1的数据和串口2的数据控制外部设备1,

....... (2017-04-21 20:10) 
我觉得以设备为单位管理更方便,比如控制设备1,让串口1和串口2都给设备1发消息就行了,这样不就省去了还要做任务间的通信。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2017-4-22 18:05:08 | 显示全部楼层
谢谢。
我是新手,请多多关照。
回复

使用道具 举报

5

主题

33

回帖

92

积分

初级会员

积分
92
发表于 2017-5-13 16:48:39 | 显示全部楼层
那么多串口使用DMA+串口来做吧,然后四个任务调用数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 19:35 , Processed in 0.051231 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表