设备消息队列问题???
我有三个串口可以接收数据,接收到数据之后,发一个消息 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) //接收到数据
{
//添加处理上行数据函数
//不知道消息是哪个串口接收到的????? msg.dev已经指示出是哪个串口设备 回复【1楼】ffxz
-----------------------------------------------------------------------
我知道你是什么意思,回传数据时没有问题,但是如果我需要知道具体是哪个串口接收到数据,还要对数据进行处理?怎么办?
我怎么判别是哪个串口设备?比如有三个串口设备,分别是红外、232、和GPRS,我怎么知道具体是哪个串口接收到的数据? 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这个设备来的。 回复【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();
} 可以在初始化device的时候将处理函数注_册成device的私有数据。
uart_device->private = function1;
gprs_device->private = function2;
--------------------------------------------------------
if(fact_size > 0) //接收到数据
{
msg.dev->private()
} 回复【5楼】shaolin
-----------------------------------------------------------------------
这个好像不错,晚上回去试下,谢谢了!
页:
[1]