打印
[STM32F1]

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

[复制链接]
1135|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 的例子啊, 指参考下 不剩感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

205

帖子

2

粉丝