OpenEdv-开源电子网

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

STM32F103精英版,串口改485通讯

[复制链接]

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2023-7-26
在线时间
20 小时
发表于 2023-8-2 16:33:09 | 显示全部楼层 |阅读模式
本帖最后由 Vircyom 于 2023-8-2 16:54 编辑

因为串口2可能坏了,所以采用串口1和串口3来进行RS485通讯,在不接下位机,使用TTL转USB模块的串口3与串口1进行通讯,可以正常通讯,但是换成串口3接上48T,48R就不能进行正常通讯了,接受不了数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2023-7-26
在线时间
20 小时
 楼主| 发表于 2023-8-2 16:34:22 | 显示全部楼层
本帖最后由 Vircyom 于 2023-8-2 16:51 编辑
  1. //串口3
  2. #if EN_USART3_RX   //如果使能了接收
  3. //串口1中断服务程序
  4. //注意,读取USARTx->SR能避免莫名其妙的错误          
  5. u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

  6. //接收状态
  7. //bit15,        接收完成标志
  8. //bit14,        接收到0x0d
  9. //bit13~0,        接收到的有效字节数目
  10. u16 USART_RX_STA=0;       //接收状态标记
  11. void uart_init(u32 bound){
  12.        
  13.        
  14.                 uart1_init(bound);
  15.                 uart3_init(bound);
  16. }

  17.   
  18. void uart3_init(u32 bound){
  19.        
  20.   //GPIO端口设置
  21.   GPIO_InitTypeDef GPIO_InitStructure;
  22.         USART_InitTypeDef USART_InitStructure;
  23.         NVIC_InitTypeDef NVIC_InitStructure;
  24.          
  25. //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);        //使能USART3,GPIOB时钟
  26.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);        //使能USART3,GPIOB时钟
  27.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  28.        
  29.         //RS485使能
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                 //PD7端口配置
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  34.        
  35.         //USART3_TX   GPIOB.10
  36.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
  37.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  39.   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
  40.    
  41.   //USART3_RX          GPIOB.11初始化
  42.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
  43.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  44.   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11  
  45.        
  46.        
  47.        
  48.   //Usart3 NVIC 配置
  49.   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  50.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
  51.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级1
  52.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  53.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  54.   
  55.    //USART 初始化设置

  56.         USART_InitStructure.USART_BaudRate = bound;//串口波特率
  57.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  58.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  59.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  60.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  61.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  62.   USART_Init(USART3, &USART_InitStructure); //初始化串口3
  63.   USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
  64.   USART_Cmd(USART3, ENABLE);                    //使能串口3
  65.         USART_ClearFlag(USART3, USART_IT_RXNE);//USART_FLAG_TXE
  66. }

  67. void USART3_IRQHandler(void){                        //串口3中断服务程序
  68.        
  69.         u8 Res;
  70. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  71.         OSIntEnter();   
  72. #endif
  73.         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  74.                 {
  75.                 Res =USART_ReceiveData(USART3);        //读取接收到的数据
  76.                
  77.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  78.                         {
  79.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  80.                                 {
  81.                                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  82.                                 else USART_RX_STA|=0x8000;        //接收完成了
  83.                                 }
  84.                         else //还没收到0X0D
  85.                                 {       
  86.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  87.                                 else
  88.                                         {
  89.                                         USART_TX_BUF[USART_RX_STA&0X3FFF]=Res;   
  90.                                         USART_RX_STA++;
  91.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
  92.                                         }                 
  93.                                 }
  94.                         }                    
  95.      }



  96. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  97.         OSIntExit();                                                                                           
  98. #endif
  99. }
  100.        
  101. void USART_Send_Data(u8 *buf,u8 len,USART_TypeDef* USARTx){       //发,USARTx:读取串口x的数据,USARTy:发送给串口y
  102.         u8 t;

  103.        
  104.         for(t=0;t<len;t++)                //循环发送数据
  105.         {                  
  106.                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);       
  107.                 USART_SendData(USARTx,buf[t]);
  108.                
  109.         }
  110.        
  111. }

  112. #endif       




  113. //串口1

  114. #if EN_USART1_RX   //如果使能了接收
  115. u8 USART_TX_BUF[USART_REC_LEN];     //发送缓冲,最大USART_REC_LEN个字节
  116. u16 USART_TX_STA=0;

  117. void uart1_init(u32 bound){

  118.   //GPIO端口设置
  119.   GPIO_InitTypeDef GPIO_InitStructure;
  120.         USART_InitTypeDef USART_InitStructure;
  121.         NVIC_InitTypeDef NVIC_InitStructure;
  122.          
  123. //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);        //使能USART3,GPIOB时钟
  124.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //使能USART3,GPIOB时钟
  125.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  126.        
  127.         //USART1_TX   GPIOB.10
  128.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  129.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  130.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  131.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  132.    
  133.   //USART3_RX          GPIOB.11初始化
  134.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  135.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  136.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
  137.        
  138.   //Usart3 NVIC 配置
  139.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  140.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  141.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
  142.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  143.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  144.   
  145.    //USART 初始化设置

  146.         USART_InitStructure.USART_BaudRate = bound;//串口波特率
  147.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  148.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  149.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  150.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  151.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  152.   USART_Init(USART1, &USART_InitStructure); //初始化串口1
  153.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  154.   USART_Cmd(USART1, ENABLE);                    //使能串口1
  155. //        USART_ClearFlag(USART1, USART_IT_RXNE);
  156. }

  157. void USART1_IRQHandler(void){                        //串口1中断服务程序
  158.        
  159.         u8 Res;
  160. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  161.         OSIntEnter();   
  162. #endif
  163.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  164.                 {
  165.                 Res =USART_ReceiveData(USART1);        //读取接收到的数据
  166.                
  167.                 if((USART_TX_STA&0x8000)==0)//接收未完成  
  168.                         {
  169.                         if(USART_TX_STA&0x4000)//接收到了0x0d
  170.                                 {
  171.                                 if(Res!=0x0a)USART_TX_STA=0;//接收错误,重新开始
  172.                                 else USART_TX_STA|=0x8000;        //接收完成了
  173.                                 }
  174.                         else //还没收到0X0D
  175.                                 {       
  176.                                 if(Res==0x0d)USART_TX_STA|=0x4000;
  177.                                 else
  178.                                         {
  179.                                         USART_RX_BUF[USART_TX_STA&0X3FFF]=Res ;  
  180.                                         USART_TX_STA++;
  181.                                         if(USART_TX_STA>(USART_REC_LEN-1))USART_TX_STA=0;//接收数据错误,重新开始接收          
  182.                                         }                 
  183.                                 }
  184.                         }                    
  185.      }
  186. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  187.         OSIntExit();                                                                                           
  188. #endif
  189. }
复制代码

这是串口1和串口3互传信息的代码,通过串口实验改的485通讯,求求大佬看一下能否正常通讯。
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2023-7-26
在线时间
20 小时
 楼主| 发表于 2023-8-2 16:46:59 | 显示全部楼层
本帖最后由 Vircyom 于 2023-8-2 16:50 编辑

这是我用原子哥的串口调试助手,在电脑上进行调试的图片
微信图片_20230802164344.png
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2023-7-10
在线时间
4 小时
发表于 2023-10-24 21:40:02 | 显示全部楼层
Vircyom 发表于 2023-8-2 16:34
这是串口1和串口3互传信息的代码,通过串口实验改的485通讯,求求大佬看一下能否正常通讯。

请问实现吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 12:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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