各位大神帮我看一下,我这个是stm32F1 485接收程序,我通过串口哦调试助手发送数据给32,为什吗仿真时候,接收的数据不正确。

2019-10-16 01:28发布

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "rs485.h"

/************************************************
ALIENTEK战舰STM32开发板实验25
485通信实验
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
#define KEY0_PRES         1        //KEY0按下
//        void Delay(__IO uint32_t nTime);
int main(void)
{         
//        u8 key;
       
//        u8 i=0;
//        u8 cnt=0;
//        u8 rs485buf[5];
        // KEY_Init();                                //按键初始化               
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位响抢占优先级,2位应优先级
  delay_init();                     //延时函数初始化                  
        RS485_Init(9600);        //初始化RS485
                                                                          
        while(1)
        {               
       
//                        for(i=0;i<5;i++)
//                        {
//                                rs485buf=cnt+i;//填充发送缓冲区
//                         }
//                //        RS485_TX_EN=0;
//                //                delay_ms(10);
//                        //Delay(10);//延时
//                //        RS485_Send_Data(rs485buf,5);//发送5个字节                
//                //        RS485_Receive_Data(rs485buf,5);
//     // Delay(3);
//                        delay_ms(10);
                        //RS485_Receive_Data(rs485buf,);
}
        }

#include "sys.h"                    
#include "rs485.h"         
#include "delay.h"

//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//RS485驱动 代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/9
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////


#ifdef EN_USART2_RX           //如果使能了接收


//接收缓存区        
u8 RS485_RX_BUF[64];          //接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0;                     
__IO uint32_t TimingDelay;
void USART2_IRQHandler(void)
{
        u8 res;            

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据
        {         
                                  
                res =USART_ReceiveData(USART2);         //读取接收到的数据
                if(RS485_RX_CNT<64)
                {
                        RS485_RX_BUF[RS485_RX_CNT]=res;                //记录接收到的值
                        RS485_RX_CNT++;                                                //接收数据增加1
                }
        }                                                                                           
}
#endif                                                                                 
//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率          
void RS485_Init(u32 bound)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOA,D时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                 //PD7端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;        //PA2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

        //RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
//        RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位

       
          
        USART_InitStructure.USART_BaudRate = bound;//波特率设置
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
        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_Rx | USART_Mode_Tx;//收发模式

  USART_Init(USART2, &USART_InitStructure); ; //初始化串口

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级2级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
//   
USART_Cmd(USART2, ENABLE);                    //使能串口



RS485_TX_EN=0;                        //默认为接收模式

}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
//void RS485_Send_Data(u8 *buf,u8 len)
//{
//        //u8 t;
////        RS485_TX_EN=1;                        //设置为发送模式
//        //delay_ms(10);
//          //for(t=1;t<len;t++)                //循环发送数据
//        //{                  
//                while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);          
//                USART_SendData(USART2,buf[1]);
//        //}         
//
//        //while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);               
////        RS485_RX_CNT=0;          
//        //RS485_TX_EN=1;                                //设置为接收模式       
//}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //默认为0
        delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
        if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=RS485_RX_BUF;       
                }               
                *len=RS485_RX_CNT;        //记录本次数据长度
                 RS485_RX_CNT=0;                //清零
        }
}



















友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
feisheng168
1楼-- · 2019-10-16 03:43
顶,太长了,呵呵。
林杰1314
2楼-- · 2019-10-16 09:40
feisheng168 发表于 2016-12-16 16:30
顶,太长了,呵呵。

谢谢

一周热门 更多>