STM32串口接收字符串问题

2019-07-14 19:14发布

单个字节的收发都没问题,看了下字符串的收发,还是不明白原理,在串口中断里面还是会用的查询数据寄存器的函数USART_ReceiveData(USART1),虽然定义了一个变量来读取数据data=USART_ReceiveData(USART1);然后在把这个变量data赋给一个数组,但是data的值不是一样永远是字符串的最后一个字节吗?因为我发送的字符串是一次性发送的啊,不是一个一个的发送啊,数据寄存器里的数据会被最后一个字符覆盖啊。如果我发送一个字符就读取一次数据,然后赋给数组,这样是可以的,但是这就不是接收字符串了啊!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
追风逐月
1楼-- · 2019-07-14 22:25
void USART1_IRQHandler(void)                  //接收数据
{
         
         if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)
             {
                      for(RS485_RX_CNT=0;RS485_RX_CNT<5;RS485_RX_CNT++)      
                                {
                                     res=USART_ReceiveData(USART1);
                                         if(RS485_RX_CNT<64)
                                             {
                                                 RS485_RX_BUF[RS485_RX_CNT]=res;
                                                         RS485_RX_CNT++;
                                                  }
                                         
                                         }
                          
                                      flag++;
                                  USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                                         
                                       
                 }
       
}
中断函数,这样完全没用啊,接收到的还是字符串的最后一个字符               
追风逐月
2楼-- · 2019-07-15 02:40
 精彩回答 2  元偷偷看……
人中狼
3楼-- · 2019-07-15 07:31
做测试用,先假定数组长度为12,数据接收后大于12长度的数据覆盖最早的数据,可以试试发送一个长度大于12,但小于24的字符串看看效果,每调试过,应该是接收的第13个字符会覆盖数组第一个字符,以此类推
void USART1_IRQHandler(void)                  //接收数据
{
         if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)
              {
                                     res=USART_ReceiveData(USART1);
                                          if(RS485_RX_CNT<12)
                                              {
                                                  RS485_RX_BUF[RS485_RX_CNT]=res;
                                                          RS485_RX_CNT++;
                                                   }
                                             RS485_RX_CNT = 0;
                                      flag++;
                                   USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                                          
                                         
                  }
         
}

追风逐月
4楼-- · 2019-07-15 10:58
人中狼 发表于 2017-10-12 16:27
做测试用,先假定数组长度为12,数据接收后大于12长度的数据覆盖最早的数据,可以试试发送一个长度大于12,但小于24的字符串看看效果,每调试过,应该是接收的第13个字符会覆盖数组第一个字符,以此类推
void USART1_IRQHandler(void)                  //接收数据
{

问题不在数组上面, res=USART_ReceiveData(USART1);res只是一个整型变量,接收数据后res的值只可能是字符串的最后一个字符啊;难道第一字符接收给res后,res在赋值给数组的【1】元素,但是这里没有循环啊,而且发送端是一次性发送啊,串口的数据寄存器要一个个的处理了?这不可能啊。

  res是整型变量也只能表示一个字符啊,所以这个中断不可能接收一个字符串啊。但是网上都是这样的啊
追风逐月
5楼-- · 2019-07-15 15:37
看来我得去看看以前51的程序了,实在想不明白了
人中狼
6楼-- · 2019-07-15 16:43
RS485_RX_CNT++;这里就是在循环了,原理和过程跟51是一样的

一周热门 更多>