OpenEdv-开源电子网

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

485通讯改成usart3,数据发不过来

[复制链接]

10

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2023-4-25
在线时间
45 小时
发表于 2023-5-17 11:17:13 | 显示全部楼层 |阅读模式
1金钱
单片机用485线与电脑连接,按照例程数据发送到串口助手了,改成usart3,去掉跳线帽,用杜邦线将PB10,PB11和TX,RX连接
各位大佬,麻烦看看我那里错了
  1. #include "sys.h"                    
  2. #include "rs485.h"         
  3. #include "delay.h"

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


  16. #ifdef EN_USART3_RX           //如果使能了接收


  17. //接收缓存区        
  18. u8 RS485_RX_BUF[64];          //接收缓冲,最大64个字节.
  19. //接收到的数据长度
  20. u8 RS485_RX_CNT=0;                     
  21.   
  22. void USART3_IRQHandler(void)
  23. {
  24.         u8 res;            

  25.         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收到数据
  26.         {         
  27.                                   
  28.                 res =USART_ReceiveData(USART3);         //读取接收到的数据
  29.                 if(RS485_RX_CNT<64)
  30.                 {
  31.                         RS485_RX_BUF[RS485_RX_CNT]=res;                //记录接收到的值
  32.                         RS485_RX_CNT++;                                                //接收数据增加1
  33.                 }
  34.         }                                                                                           
  35. }
  36. #endif                                                                                 
  37. //初始化IO 串口2
  38. //pclk1:PCLK1时钟频率(Mhz)
  39. //bound:波特率          
  40. void RS485_Init(u32 bound)
  41. {  
  42.         GPIO_InitTypeDef GPIO_InitStructure;
  43.         USART_InitTypeDef USART_InitStructure;
  44.         NVIC_InitTypeDef NVIC_InitStructure;

  45.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOA,D时钟
  46.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART2时钟
  47.        
  48.        
  49.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                 //PD7端口配置
  50.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  51.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  52.         GPIO_Init(GPIOD, &GPIO_InitStructure);

  53.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;        //PB10
  54.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
  55.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  56.    
  57.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
  58.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  59.         GPIO_Init(GPIOB, &GPIO_InitStructure);  

  60.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口2
  61.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,DISABLE);//停止复位

  62.        
  63. #ifdef EN_USART3_RX                          //如果使能了接收
  64.         USART_InitStructure.USART_BaudRate = bound;//波特率设置
  65.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
  66.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  67.         USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
  68.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  69.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式

  70.     USART_Init(USART3, &USART_InitStructure); ; //初始化串口
  71.   
  72.         NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //使能串口2中断
  73.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
  74.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
  75.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  76.         NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  77.   USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
  78.    
  79.   USART_Cmd(USART3, ENABLE);                    //使能串口

  80. #endif

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

  82. }

  83. //RS485发送len个字节.
  84. //buf:发送区首地址
  85. //len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
  86. void RS485_Send_Data(u8 *buf,u8 len)
  87. {
  88.         u8 t;
  89.         RS485_TX_EN=1;                        //设置为发送模式
  90.           for(t=0;t<len;t++)                //循环发送数据
  91.         {                  
  92.                 while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);          
  93.                 USART_SendData(USART3,buf[t]);
  94.         }         

  95.         while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);               
  96.         RS485_RX_CNT=0;          
  97.         RS485_TX_EN=0;                                //设置为接收模式       
  98. }
  99. //RS485查询接收到的数据
  100. //buf:接收缓存首地址
  101. //len:读到的数据长度
  102. void RS485_Receive_Data(u8 *buf,u8 *len)
  103. {
  104.         u8 rxlen=RS485_RX_CNT;
  105.         u8 i=0;
  106.         *len=0;                                //默认为0
  107.         delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
  108.         if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
  109.         {
  110.                 for(i=0;i<rxlen;i++)
  111.                 {
  112.                         buf[i]=RS485_RX_BUF[i];       
  113.                 }               
  114.                 *len=RS485_RX_CNT;        //记录本次数据长度
  115.                 RS485_RX_CNT=0;                //清零
  116.         }
  117. }
复制代码

3.png
2.PNG
1.PNG

最佳答案

查看完整内容[请看2#楼]

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,DISABLE);//停止复位 这里把USART3的时钟关掉了吧!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2023-5-17 11:17:14 | 显示全部楼层
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口2
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,DISABLE);//停止复位
这里把USART3的时钟关掉了吧!
回复

使用道具 举报

10

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2023-4-25
在线时间
45 小时
 楼主| 发表于 2023-5-17 16:44:56 | 显示全部楼层
godark 发表于 2023-5-17 16:32
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口2
        RCC_APB1PeriphCloc ...

确实,注释掉就发过去了,但是例程里也是有这两行代码的啊.......这是为啥
回复

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2023-5-17 17:11:48 | 显示全部楼层
我的小怪兽 发表于 2023-5-17 16:44
确实,注释掉就发过去了,但是例程里也是有这两行代码的啊.......这是为啥

有时候改完的代码在不经意使用CTRL+Z时就恢复了,容易造成问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 08:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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