[STM32F4] stm32407利用RS485通信时,只能发送,不能接收数据。。

[复制链接]
8476|10
 楼主| penghuiyanbiyun 发表于 2014-12-25 15:42 | 显示全部楼层 |阅读模式
之前是用232通信已经可以通了,现在加了一个485的控制端,结果无法进入接收中断,也不能接收数据。可以发送数据。而且485的硬件没问题,用其他的程序调试可以正常发送和接收。下面是我的代码,不知道为什么进不了中断,请大家帮忙看看是什么问题
  1. /*************485宏定义****************/
  2. #define RS485TX()  GPIO_SetBits(GPIOB,GPIO_Pin_8)
  3. #define RS485RX()  GPIO_ResetBits(GPIOB,GPIO_Pin_8)


  4. /************** 串口中断接收数据 ****************/
  5. void USART1_IRQHandler(void)
  6. {
  7.     unsigned int dat;       
  8.       if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  9.            {
  10.              USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  11.              dat=USART1_GetByte();
  12.              USART1_SendByte(dat);               
  13.             }             
  14. }

  15. void RS485_GpioInit(void)
  16. {
  17. GPIO_InitTypeDef  GPIO_InitStructure;
  18. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //485使能端配置

  20. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  21. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  22. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  23. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  24. GPIO_Init(GPIOB, &GPIO_InitStructure);
  25. }

  26. void USART1_SendByte(unsigned int SendData)
  27. {
  28.    RS485TX(); //打开发送控制端
  29.    Delay(0xff);
  30.   USART_SendData(USART1,SendData); //发送数据
  31.   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待数据发送完成
  32.   Delay(0xff);
  33.   RS485RX(); //关闭发送控制端
  34. }

  35. unsigned int USART1_GetByte(void)
  36. {
  37. unsigned int  MidData=0;
  38. RS485RX(); //打开接收控制端
  39. Delay(0xff);
  40. MidData = USART_ReceiveData(USART1); //接收数据
  41. Delay(0xff);
  42. RS485TX(); //关闭接收控制端
  43. return MidData;
  44. }


  45. /**************串口的IO口配置****************/
  46. void USART_GPIO_Init(void)
  47. {
  48.         GPIO_InitTypeDef GPIO_InitStructure;

  49.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);       
  50.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  51.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);       
  52.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);       

  53.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  54.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  55.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  56.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  58.           GPIO_Init(GPIOA, &GPIO_InitStructure);

  59.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  60.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  62.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  63. }

  64. /**************开串口(波特率、停止位、接收发送中断可调)****************/
  65. void OpenCom(unsigned int BaudRate,unsigned int StopBits,unsigned int Mode)
  66. {
  67.         USART_InitTypeDef USART_InitStructure;
  68.         NVIC_InitTypeDef  NVIC_InitStructure;
  69.          
  70.         USART_GPIO_Init();  
  71.         USART_InitStructure.USART_BaudRate = BaudRate;
  72.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  73.         switch(StopBits)
  74.         {
  75.                 case 0:        USART_InitStructure.USART_StopBits = USART_StopBits_1;break;
  76.                 case 1: USART_InitStructure.USART_StopBits = USART_StopBits_2;break;
  77.                 default: break;
  78.         }
  79.        
  80.         USART_InitStructure.USART_Parity = USART_Parity_No;
  81.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  82.         USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
  83.         USART_Init(USART1, &USART_InitStructure);        /* USART configuration */
  84.         switch(Mode)
  85.         {
  86.                 case 0: USART_ITConfig(USART1,USART_IT_TXE,ENABLE);break;
  87.                 case 1:        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);break;                                                       
  88.         }
  89.        
  90.         USART_Cmd(USART1, ENABLE);
  91.         USART_ClearFlag(USART1, USART_FLAG_TC);
  92.         RS485RX();
  93.        
  94.         NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  95.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  96.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;
  97.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  98.         NVIC_Init(&NVIC_InitStructure);  
  99. }
LOVE_ELEC 发表于 2014-12-25 17:26 | 显示全部楼层
switch(Mode)
{
     case 0: USART_ITConfig(USART1,USART_IT_TXE,ENABLE);break;
     case 1: USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);break;                                                        
}
从楼主的这段程序看,楼主是只使能了其中一个中断,不知道是不是调用的参数不对?
 楼主| penghuiyanbiyun 发表于 2014-12-26 11:16 | 显示全部楼层
LOVE_ELEC 发表于 2014-12-25 17:26
switch(Mode)
{
     case 0: USART_ITConfig(USART1,USART_IT_TXE,ENABLE);break;

我不开启发送数据,只通过串口助手向板子发送数据,然后在中断里接收这些数据后放在一个数组里,都不行,就是接受中断进不去。但是可以再主函数里发送数据,不知道什么情况。能不能直接在主函数循环里写
while(1)
{
dat=USART1_GetByte();
}
然后用串口助手发送数据给串口时,dat里会有数据吗?
 楼主| penghuiyanbiyun 发表于 2015-1-4 16:27 | 显示全部楼层
已自己解决。谢谢~
刘煜上网 发表于 2016-4-21 10:07 | 显示全部楼层

楼主,我现在也遇到相同的问题,我用485实现STM32和传感器的通讯,命令发过去了,但是却进入不了接收中断函数里面去,我确定发送的命令是正确的,
void jieshou()
{
          while(        USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!= SET);
   
                        temp = USART_ReceiveData(USART2);
               
               
                che[iup]=temp;
                iup++;
}
上面这是我写的新的接受函数,因为接受中断函数进不去,我就自己重新写了一个接受函数,旧的中断函数如下
void USART2_IRQHandler(void)
{
         ch=0;
        //u8 temp=0;
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {        
            //ch = USART1->DR;
                        ch=USART_ReceiveData(USART2);
                GPIO_SetBits(mac485REDE_PORT,mac485REDE_PIN);
                delay_ms(1);
                //USART_SendData(USART2,temp);
        //        while(USART_GetFlagStatus(USART2,USART_FlAG_TXE)==RESET);
                //delay_ms(2);
                //GPIO_ResetBits(GPIOE,GPIO_Pin_5);
        //        USART_PutHEX(USART2,ch);
                printf("%c",ch);
        }
         
}

然后现在的问题是接收过来的数据只有一个十六进制数01,本来应该会返回5个十六进制数01 05 02 3F 3F,能请楼主给我指导一下吗?我是初学者,希望能有大神给我指导一下
taijing33 发表于 2016-5-28 09:28 | 显示全部楼层

怎么解决的啊。我的问题和你的一样
shijie47 发表于 2017-5-10 21:33 | 显示全部楼层
同问,怎么解决的呢?
plsbackup 发表于 2017-5-10 23:38 | 显示全部楼层
通信的方式对不对?
plsbackup 发表于 2017-5-10 23:40 | 显示全部楼层
使用示波器测量IO的电平。
GEA 发表于 2018-7-2 16:42 | 显示全部楼层
楼主 你好 请问当时是怎么解决的 同样的问题
abc威哥 发表于 2018-9-25 15:32 | 显示全部楼层
同问,如何解决的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

110

帖子

1

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