OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2705|回复: 0

基于 STM32F103VE 在uc/os iii 移植FreeModbus能正常接收,但不能正常发送

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-10-21
在线时间
3 小时
发表于 2016-10-22 16:44:37 | 显示全部楼层 |阅读模式
基于 STM32F103VE 在uc/os iii 移植FreeModbus能正常接收,但不能正常发送。都是在中断中进行的。
1, 测试没有带ucos iii ,没有带 FreeModbus的,利用中断能正常接收,也能正常发送。说明硬件没有问题。


2,在uc/os iii 且移植FreeModbus 能正常接收,能进入中断,就是在中断里的 USART_SendData(USART1, date)没有数据发出,示波器测试确定真的没有数据发出。
      把在中断处理发送的代码利用信号量转换成任务级来发送也是一样的没有数据发出(不用这个方法直接在串口中断里面发送数据处理也是一样的不能正常发送),在USART_SendData(USART1, date); 加入while (USART_GetFlagStatus(USART1,USART_FLAG_TC)        !=SET);也是一样的没有数据发出。如下是直接在中断里面处理的:


请各位大师指点,请原子哥出山指点。


中断程序如下:
//此做从机,被动的接收,再发送数据。
void USART1_IRQHandler(void)
{
         OS_ERR      err;


        OSIntEnter();                                            
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
        {
                 USART_ClearITPendingBit(USART1, USART_IT_RXNE);
               
                                //        发布任务信号量
          OSTaskSemPost((OS_TCB  *)&AppTaskUsart1RXTCB,//AppTaskUsart1RXTCB,                    //目标任务
                                                                 (OS_OPT   )OS_OPT_POST_NONE,                        //没选项要求
                                                                 (OS_ERR  *)&err);                                   //返回错误类型                       
                //prvvUARTRxISR();             //Modbus Uart1 ISR               
         }
       


        if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)
        {                        
                            /*        // 发布任务信号量
                        // OSTaskSemPost((OS_TCB  *)&AppTaskUsart1TXTCB,                       //目标任务
                        //                                         (OS_OPT   )OS_OPT_POST_NONE,                             //没选项要求
                        //                                         (OS_ERR  *)&err);   
                           */            
           prvvUARTTxReadyISR();  //Modbus Uart1 ISR       
                    // USART_ClearITPendingBit(USART1, USART_IT_TC);//USART_IT_TC                       
        }
  OSIntExit();                                     
}

prvvUARTTxReadyISR()函数与 发送有关的部分如下:

    case STATE_TX_XMIT:
        /* check if we are finished. */
        if( usSndBufferCount != 0 )
        {                                                  
           USART_ClearITPendingBit(USART1, USART_IT_TC);
            xMBPortSerialPutByte( ( CHAR )*pucSndBufferCur ); //此函数 即 :USART_SendData(USART1, ucByte);这个函数。
           while (USART_GetFlagStatus(USART1, USART_FLAG_TXE)== RESET); //USART_FLAG_TC!=SET);         //               
            USART_ClearITPendingBit(USART1, USART_IT_TC);
           pucSndBufferCur++;  /* next byte in sendbuffer. */
            usSndBufferCount--;
         }
        else
        {
            xNeedPoll = xMBPortEventPost( EV_FRAME_SENT );
            vMBPortSerialEnable( TRUE, FALSE );
            eSndState = STATE_TX_IDLE;
         }
        break;


操作系统正常运行,我用uc/probe 测过的,就是USART_SendData(USART1, ucByte)没有数据发出,我用示波器也测过。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 22:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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