找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1443|回复: 3
打印 上一主题 下一主题
收起左侧

stm32f103c8用串口2接受字符串,串口1发出对应数组的问题

[复制链接]
跳转到指定楼层
楼主
ID:850421 发表于 2021-11-22 23:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我自己写的,感觉串口配置出问题了,串口1发送没问题;但是串口二的接收字符串后马上串口1发送数组不行。有没有大佬帮忙修改一下
  1. #include "usart.h"                 
  2. #include "led.h"
  3. #include "SysTick.h"
  4. #include "string.h"
  5. #include "DFPlayer.h"
  6. /*******************************************************************************
  7. * 函 数 名         : USART1_Init
  8. * 函数功能                   : USART1初始化函数
  9. * 输    入         : bound:波特率
  10. * 输    出         : 无
  11. *******************************************************************************/
  12. void USART1_Init(u32 bound)
  13. {
  14.    //GPIO端口设置
  15.         GPIO_InitTypeDef GPIO_InitStructure;
  16.         USART_InitTypeDef USART_InitStructure;
  17.         NVIC_InitTypeDef NVIC_InitStructure;
  18.       
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

  21.       
  22.         /*  配置GPIO的模式和IO口 */
  23.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX                           //串口输出PA9
  24.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  25.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;            //复用推挽输出
  26.         GPIO_Init(GPIOA,&GPIO_InitStructure);  /* 初始化串口输入IO */
  27.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX                         //串口输入PA10
  28.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;                  //模拟输入
  29.         GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
  30.       


  31.    //USART1 初始化设置
  32.         USART_InitStructure.USART_BaudRate = bound;//波特率设置
  33.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  34.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  35.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  36.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  37.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式
  38.         USART_Init(USART1, &USART_InitStructure); //初始化串口1
  39.       
  40.         USART_Cmd(USART1, ENABLE);  //使能串口1
  41.       
  42.         USART_ClearFlag(USART1, USART_FLAG_TC);
  43.                
  44.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
  45.       
  46.         while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);         


  47.         //Usart1 NVIC 配置
  48.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
  49.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
  50.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //子优先级3
  51.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  52.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、      
  53. }








  54. /*******************************************************************************
  55. * 函 数 名         : USART1_Send_Data
  56. * 函数功能                   : USART1发送函数
  57. * 输    入         : buf
  58. * 输    入         : len
  59. * 输    出         : 无
  60. *******************************************************************************/
  61. void USART1_Send_Data(u8 *buf,uint16_t len)
  62. {
  63.                 u8 t=0;
  64.           for(t=0;t<len;t++)                //循环发送数据
  65.     {   
  66.                                 USART_SendData(USART1,buf[t] );  
  67.                                 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);         
  68.     }               
  69. }



  70. /*******************************************************************************  
  71. * 函 数 名         : uart2_init  
  72. * 函数功能         : IO端口及串口2,时钟初始化函数     A2,A3   
  73. * 输    入         : 无  
  74. * 输    出         : 无  
  75. *******************************************************************************/   
  76. void USART2_Init(u32 bt)   
  77. {   
  78.      USART_InitTypeDef USART_InitStructure;   
  79.   NVIC_InitTypeDef NVIC_InitStructure;     
  80.     GPIO_InitTypeDef GPIO_InitStructure;    //声明一个结构体变量,用来初始化GPIO   
  81.    //使能串口的RCC时钟   
  82.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能UART3所在GPIOB的时钟   
  83.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);   


  84.    //串口使用的GPIO口配置   
  85.    // Configure USART2 Rx (PB.11) as input floating      
  86.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   
  87.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  88.    GPIO_Init(GPIOA, &GPIO_InitStructure);   


  89.    // Configure USART2 Tx (PB.10) as alternate function push-pull   
  90.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;   
  91.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  92.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  93.    GPIO_Init(GPIOA, &GPIO_InitStructure);   


  94.    //配置串口   
  95.    USART_InitStructure.USART_BaudRate = bt;   
  96.    USART_InitStructure.USART_WordLength = USART_WordLength_8b;   
  97.    USART_InitStructure.USART_StopBits = USART_StopBits_1;   
  98.    USART_InitStructure.USART_Parity = USART_Parity_No;   
  99.    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   
  100.    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   




  101.    // Configure USART   
  102.    USART_Init(USART2, &USART_InitStructure);//配置串口


  103.   // Enable USART1 Receive interrupts 使能串口接收中断   
  104.    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);   
  105.    //串口发送中断在发送数据时开启   
  106.    //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);   


  107.    // Enable the USART3     
  108.    USART_Cmd(USART2, ENABLE);//使能串口   


  109.    //串口中断配置   
  110.    //Configure the NVIC Preemption Priority Bits      
  111.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   


  112.    // Enable the USART Interrupt     
  113.    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;   
  114.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   
  115.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
  116.    NVIC_Init(&NVIC_InitStructure);   
  117. }   


  118. char USART_ReceiveString[50];                                                                                                        //接收PC端发送过来的字符
  119. int Receive_Flag = 0;                                                                                                                        //接收消息标志位
  120. int Receive_sum = 0;                                                                                                                        //数组下标


  121. void USART2_IRQHandler(void)   //中断
  122. {
  123.         if(USART_GetITStatus(USART2,USART_IT_RXNE) == 1)                                                        //USART_FLAG_RXNE判断数据,== 1则有数据
  124.         {
  125.                 if(Receive_sum > 49)                                                                                                        //数组能存放50个字节的数据                              
  126.                 {
  127.                         USART_ReceiveString[49] = '\0';                                                                                //数据字节超过50位时,将最后一位设置为\0      
  128.                         Receive_Flag = 1;                                                                                                        //接收标志位置1,停止接收数据
  129.                         Receive_sum = 0;                                                                                                        //数组下标置0
  130.                 }
  131.                
  132.                 if(Receive_Flag == 0)                                                                                                        //接收标志位等于0,开始接收数据
  133.                 {
  134.                         USART_ReceiveString[Receive_sum] = USART_ReceiveData(USART2);                //通过USART2串口接收字符
  135.                         Receive_sum++;                                                                                                                //数组下标++
  136.                 }
  137.                
  138.                 if(Receive_sum >= 2)                                                                                                        //数组下标大于2
  139.                 {
  140.                         if(USART_ReceiveString[Receive_sum-2] == '\r' && USART_ReceiveString[Receive_sum-1] == '\n' )
  141.                         {
  142.                                 USART_ReceiveString[Receive_sum-1] = '\0';                                               
  143.                                 USART_ReceiveString[Receive_sum-2] = '\0';
  144.                                 Receive_Flag = 1;                                                                                                //接收标志位置1,停止接收数据
  145.                                 Receive_sum = 0;                                                                                                //数组下标置0                              
  146.                                 if(strcmp(USART_ReceiveString,"batteriesHarmful") == 0)
  147.                                 {
  148.           led1=!led1;
  149.                                 }
  150.                                 if(strcmp(USART_ReceiveString,"cansRecyclable") == 0)
  151.                                 {
  152.                                         Uart_DFPlayer(0x03 , 0x02) ;
  153.                                 }
  154.                                 if(strcmp(USART_ReceiveString,"cartonRecyclable") == 0)
  155.                                 {
  156.                                         Uart_DFPlayer(0x03 , 0x03) ;
  157.                                 }
  158.                                 if(strcmp(USART_ReceiveString,"cigaretteDry") == 0)
  159.                                 {
  160.                                         Uart_DFPlayer(0x03 , 0x04) ;
  161.                                 }
  162.                                 if(strcmp(USART_ReceiveString,"tissueDry") == 0)
  163.                                 {
  164.                                         Uart_DFPlayer(0x03 , 0x05) ;
  165.                                 }
  166.                               
  167.                                 Receive_Flag = 0;                              
  168.                         }               
  169.                 }
  170.                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);                                                        //接收后先清空标志位
  171.         }
  172.       
  173. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2021-11-24 03:32 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:752974 发表于 2021-11-24 17:28 | 只看该作者
发送数据需要时间,收到一个字节数据立即用另一个口发送,都是用中断,或都是用查询,就易出问题,主要是发送占用CPU时,收到一个字节数据没有及时取走,就会被下一个接收的数据覆盖,或接收口占用CPU,同样会导致发送不能正常工作。
回复

使用道具 举报

地板
ID:311903 发表于 2021-11-25 13:59 | 只看该作者
你这样处理不好,对于接受,开一个乒乓缓存吧,fifo1接受一帧后,切换到fifo2接受,并把fifo1的数据发出去
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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