|
一个关于STM32串口的问题。他想实现接收无限制字符数量的串口信息。$ H9 j, {8 A0 V% M+ M/ @8 i ' z5 Y. k8 i5 W7 _7 t 但是他遇到了一个问题,他在主函数中发送循环发送内容(500ms的延时)串口一中断回调函数中如果收到了串口内容,就利用串口发送。 但是他的串口一旦接收到了信息就会导致主循环中的串口发送极快。他的主代码如下9 V# s3 i% s6 Y& M1 g1 b& G
看了他的代码,就这么短短的7行代码,让我汗流浃背。 & a. W6 |9 D4 s1 G( Y 他的发送和接收中有一个参数是8,这意味着当串口接收的寄存器中有8个数据时就会触发中断回调。 % w6 A( e* M0 ?2 f 我们需要注意的是,串口寄存器的数据会被存储到缓存区中,这里的缓存区相当于一个队列先进先出,当我们调用HAL_UART_Receive_IT(&huart1,&RecieveBuffer,8);+ X3 H2 ~" Z, ]' c 会将RecieveBuffer作为缓存区,将串口接收的信息存入缓存区。, U" L6 H0 `( O8 A* c 7 C F- a% v7 B4 p 那么让我们来试一下这段代码。9 ?+ j" d; |/ H v# M5 L% d
6 J% k3 l/ c; `, m5 E j 可以看到,代码死住了。其实不难理解,我们发送数据的时候,由于缓存区只有一个字符的空间,我们发送八个字符的时候会导致缓存区溢出。所以我朋友的代码可以“正常运行”也是一件非常奇怪的事情。4 o/ n, X% h, @( w" H4 S, m/ l4 k; u 6 x3 F7 ]. o# ?" f/ B; f( f# ^9 X6 @ 所以正确的做法应该是:设置和缓存区一样长的读取字符。 9 B! L3 X' n* [$ Z5 V! U% @" }: ^
这样子就可以实现每接收8个字符就调用中断一次 * x) b9 N f, p1 d" p5 i& A
可以看到,我们正常的发送了8个字符。- p0 ^3 j5 g! e1 ] & x8 V9 O: b9 B; @4 U7 c( o# N- @ 但是这样子有一个非常非常致命的缺点!1 e+ b$ L7 l+ |! j0 u 0 S9 N2 K4 h2 i" Z8 H7 O2 Z 由于我们的代码每8个才会接收一次,所以当我们的发送的数量小于8时,必须发送多次才能会触发一次调用。% M# L% D9 D$ Y( E( {2 j 注意,这里的每次我们都是先发送再接收,因为初始化的时候是启用了接收。
7 `$ }- O! ?! I* O! V* e) y 当我们发送3次“123”时才能让接收的字符>=8,我们把前八个发送了出去,此时缓存区剩下了一个字符是“3” d! @1 b; P+ V. L u 6 g+ y+ }" w8 ^, X5 `. w- D6 V
第二次我们发送了三次“123123123”,再次让字符数量>=8,这时候把缓存区的八个“31231231”发送出去再接收后面的“23”,这时候缓存区的数据为:"23 "。2 ^# c0 J" O& X7 F3 E$ }" U
最后我们第三次发送“123”的时候,由于23 + 123 + 123 这时候,虽然这里按理来说正好八个,但是实际测下来,当这时候接收的时候系统就会卡死。, _! y3 I* K7 K/ t 1 O7 C% z+ j" S4 l: ^5 q 所以,实际上这种方法必须保证发送端的数据是完完整整的八个八个发送,多一个少一个都不行。 5 o0 p7 K0 z2 |% X1 j# K% ^9 G 解法 事实上最标准的做法是单个字符单个字符处理。定义一个大的缓存区,用来存储接收到的字符并且确立一个结束符来确定数据流的结束。
( m. z: @2 W G9 M; x! K, Y) X 上述是正点原子的官方例程,其中USART_RX_STA是接收到的字符,即是确定一个结束符\r\n来作为一串字符的结尾并且检测长度是否超出长度。% R2 l) W" ?# B! k- p- ^/ S- \# b . m B$ `% \4 L: v: A0 {8 f 这样子的代码容错率非常高,也确定了一个规范,并且避免了缓存区溢出的情况。 转载自:电路小白3 C- q I/ J" c; B8 \ 如有侵权请联系删除- f Y8 N6 j# |" N+ T $ u+ u q) D2 Z- X( J5 Z8 a6 k |
STM32C542RC开发板的串口不定长数据接收实验
STM32C542RC开发板的串口DMA发送及接收实验
终于完成了STM32C542RC开发板的串口发送实验
STM32L562DK探索板——串口通讯的再测试
经验分享 | STM32 IAP应用时的跳转注意事项
实战经验 | 碰到hardfault问题你还在死磕代码吗?
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【福利三:雨露均沾·逢7狂欢】之一:STM32F1外部中断异常故障的解决办法
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
微信公众号
手机版