搜索
bottom↓
回复: 6

设备消息队列问题???

[复制链接]

出0入0汤圆

发表于 2011-6-14 21:58:03 | 显示全部楼层 |阅读模式
我有三个串口可以接收数据,接收到数据之后,发一个消息 msg 到消息队列,建立一个任务用于接收三个串口发过来的消息,但是我怎么确定接收到的消息是第几个串口发出来呢???欢迎各位探讨!
消息的定义如下:
struct rx_msg
{
    rt_device_t         dev;  //设备
    rt_uint16_t           size; //接收到的数据大小
       
};
串口回调函数如下:
//==============================================================================
//名称:uart_indicate
//功能:串口接收回调函数
//入参:dev 设备 size 设备接收到的字节大小
//出参:rt_err_t 串口接收到的实际数据的长度
//说明:当判断串口接收完成时,调用此函数
//==============================================================================
rt_err_t uart_indicate(rt_device_t dev,rt_size_t size)
{
    struct rx_msg msg;
   
    msg.dev = dev;            //设备
    msg.size = size;          //接收到的数据大小
   
    rt_mq_send(Uart_Rx_mq,&msg,sizeof(struct rx_msg));   //发送消息到消息队列
   
    return msg.size;
}
接收任务线程如下:
//================================================================
//名称: UpProtocol_thread_enter
//功能:
//入参:
//出参:
//说明:
//================================================================
void UpProtocol_thread_enter(void *parameter)
{
          struct rx_msg msg;
        rt_uint16_t size = 4096,fact_size = 0;
        rt_uint8_t *mq_buff;
       
        //mq_buff = rt_mp_alloc(&mem_blocksize_512,RT_WAITING_FOREVER);                //分配静态内存池
       
          while(1)
        {
                rt_mq_recv(Uart_Rx_mq,&msg,sizeof(msg),RT_WAITING_FOREVER);                //接收消息队列
               
                mq_buff = rt_mp_alloc(&mem_blocksize_2055,RT_WAITING_FOREVER);        //获取静态内存池
               
                rt_device_open(msg.dev,RT_DEVICE_OFLAG_RDONLY);
                fact_size = rt_device_read(msg.dev,0,mq_buff,size);                                //读取串口接收到的数据
                if(fact_size > 0)                //接收到数据
                {       
                        //添加处理上行数据函数
                          //不知道消息是哪个串口接收到的?????

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-6-15 07:19:37 | 显示全部楼层
msg.dev已经指示出是哪个串口设备

出0入0汤圆

 楼主| 发表于 2011-6-16 09:00:05 | 显示全部楼层
回复【1楼】ffxz
-----------------------------------------------------------------------

我知道你是什么意思,回传数据时没有问题,但是如果我需要知道具体是哪个串口接收到数据,还要对数据进行处理?怎么办?
我怎么判别是哪个串口设备?比如有三个串口设备,分别是红外、232、和GPRS,我怎么知道具体是哪个串口接收到的数据?

出0入0汤圆

发表于 2011-6-16 11:34:15 | 显示全部楼层
rt_device_open(msg.dev,RT_DEVICE_OFLAG_RDONLY);
fact_size = rt_device_read(msg.dev,0,mq_buff,size); //读取串口接收到的数据
if(fact_size > 0) //接收到数据
{
//添加处理上行数据函数
   //不知道消息是哪个串口接收到的?????

为什么不知道是哪个串口设备接受到的数据,你是通过rt_device_read(msg.dev,0,mq_buff,size)接口来读的,那当然接收回来的数据是从msg.dev这个设备来的。

出0入0汤圆

 楼主| 发表于 2011-6-16 11:47:46 | 显示全部楼层
回复【3楼】shaolin
-----------------------------------------------------------------------

比如我有三个函数,分别为 function1(void)、function2(void)、function3(void)分别对应红外、232、GPRS,请问我怎么写程序???我总不会 if(msg.dev == USART1)吧,这样也编译不过去啊?请教....

rt_device_open(msg.dev,RT_DEVICE_OFLAG_RDONLY);  
fact_size = rt_device_read(msg.dev,0,mq_buff,size); //读取串口接收到的数据  
if(fact_size > 0) //接收到数据  
{  
  //添加处理上行数据函数  
   //不知道消息是哪个串口接收到的?????  
   if(???)
       function1();
   else if(???)
       function2();
   else
       function3();
}

出0入0汤圆

发表于 2011-6-16 11:59:55 | 显示全部楼层
可以在初始化device的时候将处理函数注_册成device的私有数据。
uart_device->private = function1;
gprs_device->private = function2;
--------------------------------------------------------
if(fact_size > 0) //接收到数据   
{   
    msg.dev->private()
}

出0入0汤圆

 楼主| 发表于 2011-6-16 12:35:33 | 显示全部楼层
回复【5楼】shaolin
-----------------------------------------------------------------------

这个好像不错,晚上回去试下,谢谢了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 13:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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