野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6275|回复: 2

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

[复制链接]
发表于 2016-10-22 16:43:48 | 显示全部楼层 |阅读模式
本帖最后由 cjdxyhz@126.com 于 2016-10-21 16:40 编辑

基于 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)
        {
         USART_ClearITPendingBit(USART1, USART_IT_TXE);//USART_IT_TC               
       
                        // 发布任务信号量
          OSTaskSemPost((OS_TCB  *)&AppTaskUsart1TXTCB,                       //目标任务
                                                                 (OS_OPT   )OS_OPT_POST_NONE,                             //没选项要求
                                                                 (OS_ERR  *)&err);                   
  //         prvvUARTTxReadyISR();  //Modbus Uart1 ISR                 
        }

  OSIntExit();                                     
}

任务处理如下:
// USART1 发送中断发出信号量。  
static  void  AppTaskUsart1TX ( void * p_arg )
{
        OS_ERR  err;       
        CPU_TS   ts;
        (void)p_arg;               
   while (DEF_TRUE)
                 {                                                     //接收一个中断发送到任务信号量。                              
                   //阻塞任务,直到中断发出信号量,发部任务信号量
            OSTaskSemPend ((OS_TICK   )0,                        //无期限等待
                                                                          (OS_OPT     )OS_OPT_PEND_BLOCKING,     //如果信号量不可用就等待
                                                                          (CPU_TS    *)&ts,                     //获取信号量被发布的时间戳
                                                                          (OS_ERR    *)&err);                    //返回错误类型                                                                                                                                              
                        prvvUARTTxReadyISR();                                //Modbus Uart1 ISR                       
     }
}


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

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


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



回复

使用道具 举报

发表于 2016-10-22 17:04:20 | 显示全部楼层
测的是485引脚没信号还是usart引脚没信号?另外确认下那个发送函数有没有被执行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-24 08:41:03 | 显示全部楼层
是485引脚,usart引脚都没信号,发送函数执行了。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-1 08:25 , Processed in 0.056151 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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