STM32串口接收字符串问题

2019-07-14 19:14发布

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


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
追风逐月
1楼-- · 2019-07-15 22:26
 精彩回答 2  元偷偷看……
追风逐月
2楼-- · 2019-07-16 00:33
追风逐月 发表于 2017-10-12 17:05
如果我一次发了10个字符,那么会进10次中断,分别把这10个字符放到数组里面?但STM32有那么快吗?我是一次发了10个字符啊,STM32每次接收到一个字符就中断一次来处理这个字符到数组里面,真的有那么快?明天在把程序好好修理一下试试。 ...

今天试试了,字符会丢失一部分,也就是说中断处理并没有把每个字符都接收到,在处理的时候一部分字符被覆盖掉了。为啥网上那么多这样的程序呢?
robinxue
3楼-- · 2019-07-16 03:25
传统的字符串接收,就是一个字符一个字符的接收,

判断结束有两个方法,一个是固定结束符;一个是延时,延时到了没有数据就算这包数据的结束
hao27695199
4楼-- · 2019-07-16 04:51
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++;
                                                         return;//加上这句
                                                   }
                                             RS485_RX_CNT = 0;
                                      flag++;
                                   USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                  }
         
}//试一下
hao27695199
5楼-- · 2019-07-16 06:35
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++;
                                                         return;//加上这句
                                                   }
                                             RS485_RX_CNT = 0;
                                      flag++;
                                   USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                  }
         
}//试一下
追风逐月
6楼-- · 2019-07-16 07:47
 精彩回答 2  元偷偷看……

一周热门 更多>