wenyu520 发表于 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)                //接收到数据
                {       
                        //添加处理上行数据函数
                          //不知道消息是哪个串口接收到的?????

ffxz 发表于 2011-6-15 07:19:37

msg.dev已经指示出是哪个串口设备

wenyu520 发表于 2011-6-16 09:00:05

回复【1楼】ffxz
-----------------------------------------------------------------------

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

shaolin 发表于 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这个设备来的。

wenyu520 发表于 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();
}

shaolin 发表于 2011-6-16 11:59:55

可以在初始化device的时候将处理函数注_册成device的私有数据。
uart_device->private = function1;
gprs_device->private = function2;
--------------------------------------------------------
if(fact_size > 0) //接收到数据   
{   
    msg.dev->private()
}

wenyu520 发表于 2011-6-16 12:35:33

回复【5楼】shaolin
-----------------------------------------------------------------------

这个好像不错,晚上回去试下,谢谢了!
页: [1]
查看完整版本: 设备消息队列问题???