[STM32F1] UCOS 中的modbus通讯怎么才能实时通讯

[复制链接]
1339|1
 楼主| 电子过客 发表于 2016-6-12 19:47 | 显示全部楼层 |阅读模式
做了3个任务, 两个任务采集网口数据  Task_TcpClient1( void * p_arg )    Task_TcpClient2( void * p_arg )
另一个任务采进行MODBUS 通讯,  
把网口的通讯任务优先级设置为5,  MODBUS任务优先级设置为4, 网口的数据可以不用实时响应,
但是MODBUS必须实时响应
函数如下
网口采集1
void  Task_TcpClient1( void * p_arg )
{
    OS_ERR      err;


   (void)p_arg;


    while (DEF_TRUE)
                        {                               //任务体,通常写成一个死循环
                            ucKLTCPFrame[6]=0x01;
                                
                        xMBTCPPortSendResponse( ucKLTCPFrame, 12 );
                                
                       do_tcp_client();   
                 
                                          
                           OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err );    //相对性延时1000个时钟节拍(1s)
    }
               
               
}


网口采集2
void  Task_TcpClient2( void * p_arg )
{
    OS_ERR      err;


   (void)p_arg;


    while (DEF_TRUE)
                        {                               //任务体,通常写成一个死循环
                            ucKLTCPFrame[6]=0x02;
                                
                        xMBTCPPortSendResponse( ucKLTCPFrame, 12 );
                                
                       do_tcp_client_1();   
                 
                                          
                           OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err );    //相对性延时1000个时钟节拍(1s)
    }
               
               
}


MODBUS任务
void  Task_Modbus ( void * p_arg )
{
   OS_ERR      err;

   CPU_SR_ALLOC();
   (void)p_arg;
   
   
    while (DEF_TRUE)
                        
                {                                        //任务体,通常写成一个死循环
                        
                       if(Uart2_rev_flag == 0x01)
                        
                     {        
                                
                                
                         Uart2_rev_flag = 0x00;//接收一帧数据标志清零
                        
                                OS_CRITICAL_ENTER();                                   //进入临界段,避免串口打印被打断
                            ParseRecieve();//MOBUS处理函数
                          
                           GPIO_ResetBits(GPIOA,GPIO_Pin_1);//485接收使能,关闭发送使能        
                        
               
                                                                             
                           USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//允许接收中断
                                         
                         OS_CRITICAL_EXIT();          //退出临界段                  
                                
                        
                     }                        
                                 
                // OSTimeDlyHMSM(0, 0,0,50,OS_OPT_TIME_HMSM_STRICT,&err);        //延时阻塞50ms
                 // OSSched();   
                  // OSTimeDly ( 10, OS_OPT_TIME_PERIODIC, & err ); //周期性延时5000个时钟节拍(5s)

    }

现在现象 modbus任务中 把延时函数 加上 防止的时候 modbus数据 有时候能采集到, 但是 非常慢,  有时候发送的数据根本没有接收到
如果把延时函数换成   OSSched(); 任务切换,可以实时响应, 但是,网口的数就采集不到了,  请教下各位有啥情况


 楼主| 电子过客 发表于 2016-6-14 15:42 | 显示全部楼层
谁使用过MODBUS 加UCOS 的例子啊, 指参考下 不剩感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

210

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部