打印
[STM32F4]

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

[复制链接]
7866|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
penghuiyanbiyun|  楼主 | 2014-12-25 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前是用232通信已经可以通了,现在加了一个485的控制端,结果无法进入接收中断,也不能接收数据。可以发送数据。而且485的硬件没问题,用其他的程序调试可以正常发送和接收。下面是我的代码,不知道为什么进不了中断,请大家帮忙看看是什么问题
/*************485宏定义****************/
#define RS485TX()  GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define RS485RX()  GPIO_ResetBits(GPIOB,GPIO_Pin_8)


/************** 串口中断接收数据 ****************/
void USART1_IRQHandler(void)
{
    unsigned int dat;       
      if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
           {
             USART_ClearITPendingBit(USART1,USART_IT_RXNE);
             dat=USART1_GetByte();
             USART1_SendByte(dat);               
            }             
}

void RS485_GpioInit(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

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

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void USART1_SendByte(unsigned int SendData)
{
   RS485TX(); //打开发送控制端
   Delay(0xff);
  USART_SendData(USART1,SendData); //发送数据
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待数据发送完成
  Delay(0xff);
  RS485RX(); //关闭发送控制端
}

unsigned int USART1_GetByte(void)
{
unsigned int  MidData=0;
RS485RX(); //打开接收控制端
Delay(0xff);
MidData = USART_ReceiveData(USART1); //接收数据
Delay(0xff);
RS485TX(); //关闭接收控制端
return MidData;
}


/**************串口的IO口配置****************/
void USART_GPIO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);       
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);       

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

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

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}

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

        switch(StopBits)
        {
                case 0:        USART_InitStructure.USART_StopBits = USART_StopBits_1;break;
                case 1: USART_InitStructure.USART_StopBits = USART_StopBits_2;break;
                default: break;
        }
       
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);        /* USART configuration */
        switch(Mode)
        {
                case 0: USART_ITConfig(USART1,USART_IT_TXE,ENABLE);break;
                case 1:        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);break;                                                       
        }
       
        USART_Cmd(USART1, ENABLE);
        USART_ClearFlag(USART1, USART_FLAG_TC);
        RS485RX();
       
        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);  
}
沙发
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 | 只看该作者
已自己解决。谢谢~

使用特权

评论回复
5
刘煜上网| | 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,能请楼主给我指导一下吗?我是初学者,希望能有大神给我指导一下

使用特权

评论回复
6
taijing33| | 2016-5-28 09:28 | 只看该作者

怎么解决的啊。我的问题和你的一样

使用特权

评论回复
7
shijie47| | 2017-5-10 21:33 | 只看该作者
同问,怎么解决的呢?

使用特权

评论回复
8
plsbackup| | 2017-5-10 23:38 | 只看该作者
通信的方式对不对?

使用特权

评论回复
9
plsbackup| | 2017-5-10 23:40 | 只看该作者
使用示波器测量IO的电平。

使用特权

评论回复
10
GEA| | 2018-7-2 16:42 | 只看该作者
楼主 你好 请问当时是怎么解决的 同样的问题

使用特权

评论回复
11
abc威哥| | 2018-9-25 15:32 | 只看该作者
同问,如何解决的?

使用特权

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

本版积分规则

26

主题

110

帖子

1

粉丝