OpenEdv-开源电子网

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

求问STM32 485能发送,但是接收不了

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-11-19
在线时间
1 小时
发表于 2016-11-19 13:53:41 | 显示全部楼层 |阅读模式
5金钱
用STM32 USART3做485,485能正常发送,同时传感器也返回了数据,用的USART3,PB11上也有数据信号。先发送数据,然后485控制位置低,然后接收。写了两种接收方式,一种非中断的,读不到数据一直卡在file:///C:\Users\s206zen\Documents\Tencent Files\494095096\Image\C2C\C5@U)(I9CF4@ZDPH_~FPXM4.pngwhile(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)    这句。

然后改成中断接收,进不了中断。

但是接收引脚上确实有信号。用的外接了,485HUB,电脑连HUB也能收到传感器返回的数据,就是STM32接收不到。贴上源码





void RS485Init(void)            //中断接收初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;  
        USART_InitTypeDef USART_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);     

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
                       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                   //485_TX
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;           //485_RX  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入  
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        USART_InitStructure.USART_BaudRate = 9600;           
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
        USART_InitStructure.USART_StopBits = USART_StopBits_1;  
        USART_InitStructure.USART_Parity = USART_Parity_No;  
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  
        USART_Init(USART3, &USART_InitStructure);  
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        USART_ITConfig(USART3,USART_IT_TXE,DISABLE);
         
        USART_Cmd(USART3, ENABLE);
         
        USART_GetITStatus(USART3, USART_FLAG_TC);   
}


static void USART3_NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        /* Configure the NVIC Preemption Priority Bits */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        /* USART3 中断优先级*/
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


int main()
{
              RS485Init();
        USART3_NVIC_Configuration();
        RS485_SET_TX_Mode();
        if(mode==1)//X模式
            {
                       
                           char adress=0x01;
                           char func=0x03;                                                                       
                          char RH=0x00;
                           char RL=0x00;
                           char RLH=0x00;
                           char RLL=0x02;
                           char CRC16L=0xc4;
                           char CRC16H=0x0B;
                              printf("%c%c%c%c%c%c%c%c\n",adress,func,RH,RL,RLH,RLL,CRC16L,CRC16H);
                        delay(10000000);
                        RS485_SET_RX_Mode();                                               
        }       

}

void USART3_IRQHandler(void)
{

        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
        {
                RcvCh = (char)USART3->DR & 0xFF;
                a=RcvCh;
                i++;       
        }
        RS485_SET_TX_Mode();

}



void RS485Init(void)            //不用中断接收,初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;  
        USART_InitTypeDef USART_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);     

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
                       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                   //485_TX
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;           //485_RX  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入  
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        USART_InitStructure.USART_BaudRate = 9600;           
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
        USART_InitStructure.USART_StopBits = USART_StopBits_1;  
        USART_InitStructure.USART_Parity = USART_Parity_No;  
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  
        USART_Init(USART3, &USART_InitStructure);  
         
        USART_Cmd(USART3, ENABLE);
         
        USART_GetITStatus(USART3, USART_FLAG_TC);   
}


int main(void)
{        
        RS485Init();
        RS485_SET_TX_Mode();
    while(1)
         {
                   if(mode==0)//RX模式
            {

                        while(1)
                        {
                            while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)
                            {
                            }

                    RcvCh = (char)USART3->DR & 0xFF;
                           a=RcvCh;
                           i++;
                           if(i==8)
                           {
                                           i=0;                         
                                        RS485_SET_TX_Mode();
                                           break;
                           }
                        }

                       

        }

                  if(mode==1)//TX模式
            {
                       
                           char adress=0x01;
                           char func=0x03;                                                                       
                          char RH=0x00;
                           char RL=0x00;
                           char RLH=0x00;
                           char RLL=0x02;
                           char CRC16L=0xc4;
                           char CRC16H=0x0B;
                              printf("%c%c%c%c%c%c%c%c\n",adress,func,RH,RL,RLH,RLL,CRC16L,CRC16H);
                        delay(1000);
                        RS485_SET_TX_Mode();
               
                                               
        }                                                                       
                delay(10000000);
               
               
          }
}




QQ截图20161119133939.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2016-9-24
在线时间
80 小时
发表于 2016-11-19 14:32:57 | 显示全部楼层
判断应该是 != RESET才对吧
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-11-19
在线时间
1 小时
 楼主| 发表于 2016-11-19 19:06:15 | 显示全部楼层
lygxnb 发表于 2016-11-19 14:32
判断应该是 != RESET才对吧

你说的是不用中断的接收吗?当他不等于的时候才会跳出while啊,没有写错吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 05:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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