你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G431RBT6串口空闲中断接收和结束符接收

[复制链接]
STMCU小助手 发布时间:2023-3-2 13:08
一、定长接收---采用
2 b9 K1 g# Z: C, {9 ~% D
( i3 w$ C+ g1 Z* Y二、以特定的符号作为结束符* u  Z- Q( o) t- D! Z  C

# x, J2 }. [% e3 t3 z/ [6 K3 D问题:①单个字符接收②转义字符
2 c' b6 ?- y; I# R+ Z
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
    1 w& H( w! T' B. P2 Q
  2.         if(huart->Instance == USART1){
    9 q+ D8 }& W1 N1 d$ M$ G
  3.                 Rx_Flag = 1;: d; W% U4 f3 w8 w# X: e6 a
  4.         }
    / r: S' O3 X' D; G
  5. }( H. j3 k  ?  g
  6. 8 i; Y' W$ |2 I9 B5 s
  7. void UART_Proc_EOC(){
    3 Z5 X2 |; O2 @9 ^/ B- c0 }
  8.         static int trans_state = 0;
    & l/ C: H5 u8 B4 A' A8 K0 V2 S
  9.         if(Rx_Flag){
    3 A5 b1 h# }- {( C9 M8 F
  10.                 Rx_Flag = 0;: a+ x  _! S, |' |
  11.                 switch(trans_state){
    ( v0 B; y7 `: e. M, Q# a1 i; y
  12.                         case 0:2 l  N* p6 o8 Q, \% e
  13.                                 if(RxTemp == TRANS_CHAR)//如果接收到的字符是转义字符
    " B2 q- p' R8 n. j
  14.                                         trans_state = 1;//就让其标志为1; H; W+ k; k  r8 n" q
  15.                                 else if(RxTemp == END_CHAR){//如果接收到的字符是结束符
    * i6 R! \( i4 w3 i
  16.                                         Update_Flag = 1;//就意味着本次接收已经结束
    3 g! g5 I3 M5 B' ~2 U' \7 M
  17.                                 }. e7 _- W( S5 y7 R1 z
  18.                                 else {
    ( E% ~3 D% B; P% }) Y
  19.                                         RxBuf[RxCount++] = RxTemp;//如果接收到的是数据,就把该字符放到数组里
    4 v9 T' s3 [/ z1 _4 R# ?
  20.                                 }+ }/ c) i" y. H# V8 m' j
  21.                                 break;
    ; i  f' i0 r3 Y7 r' m
  22.                         case 1://当接收到的字符是转义字符或者结束字符
    8 z3 Q( H5 w, l- S& F0 m4 B1 X
  23.                                 if(RxTemp != END_CHAR){//是转义字符但不是结束字符* ^- d8 L' n( Z5 j1 H
  24.                                         RxBuf[RxCount++] = TRANS_CHAR;//此转义字符是数据,要将他写进数组
    6 l9 S* f% c$ ?9 x" F
  25.                                         RxBuf[RxCount++] = RxTemp;$ i0 z/ p- s: c1 Y
  26.                                 }
    5 W5 D( Q9 E# I! W: s8 K, t
  27.                                 else {
    5 O, f; ?0 Z- T* @9 D
  28.                                         RxBuf[RxCount++] = RxTemp;
    4 _( D, v  [9 u; e' D$ e
  29.                                 trans_state = 0;+ `  M8 H7 v( l2 z8 ~5 o' i
  30.                                 break;
    7 i' U/ v- R0 q. A4 I( G
  31.                 }6 m  x1 U$ v7 S6 N( J
  32.         }
    6 P6 r0 Q0 g7 O5 y  q
  33.         if(Update_Flag == 0){//表明还没有遇到结束字符,仍需要继续接收中断; |* a& w" B$ h
  34.                 HAL_UART_Receive_IT(&huart1, &RxTemp, 1);
    & p' p7 H; V, k+ G% Y% x
  35.         }
    8 y) @% t& I6 |9 R' Q
  36. }
复制代码
# t2 B; p7 O, Q7 S$ c7 C& q
三、采用空闲中断的方式(字符串基本上是连续发送,一旦空闲实践大于某个时间,就认为这串数据接收完了),适用于不定长的接收
1 c& j2 l0 S: q8 @8 d0 I  o0 }2 z
7 Y, i# b& [( O①常规配置! g! e9 R6 Z$ N# {5 ^5 \+ T/ m. c

# P, f/ X$ j! _
119179ed10bb435a8d2805200a5d11c0.png & M# ^7 R) o$ K
3 P6 s. v! r& |) Q
②中断的方式
9 ]- J2 N: c2 p8 t. n0 J3 F8 L: I$ @' l
2cadacd22b5448ee8007ad8f903801f1.png
" ]! g3 `. C+ q! m" G8 D2 J; e8 M: d( m! i5 S
6 g+ ?4 w7 N0 }, j) m
函数中
6 Y1 c  B% E9 l7 ^( ?3 M* `    在中断模式下接收一定量的数据,直到接收到预期数量的数据或者发生空闲中断
  S" w6 t& ~% g8 W- }$ Y    HAL_UART_ReceiveToIdle_IT(&huart1, (uint8_t *)USART_RxBuf, Rx_Len);//IDLE使用3 b' q2 F' y* V  S1 w! p2 g+ [( C* N
' n) ^. ]1 e( B2 k) f$ E" U" `
写上这个函数表明接收端已经开启了空闲中断) P+ k3 [+ d7 Y, ]1 ?

2 @( Q# N/ k3 W四、DMA接收,适合接收大量的数据,一般用在报文(协议)的传输,找完整的报文(有格式)
3 s& U. T( @( k, w& S. T; k* H- @$ t————————————————
3 ]2 p" A" M0 F8 O版权声明:想要优秀点儿
4 F% G' G8 a* y1 e, N  [6 k/ W
4 I  A  @* j" Q! E  u! d+ ]
赞 收藏 评论0 发布时间:2023-3-2 13:08

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版