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

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

[复制链接]
STMCU小助手 发布时间:2023-3-2 13:08
一、定长接收---采用, p) J) E; D3 {; \

  A  M8 d3 z' u8 `1 k3 o, L1 z4 w二、以特定的符号作为结束符
7 I1 J% D2 P) ?

! ~7 N3 Y; ]" _7 `: d$ k' a/ ~问题:①单个字符接收②转义字符- H9 V4 T+ J0 K6 o. z0 G% [3 g# d! l* s
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
    5 g0 K9 R$ }1 L  H# `: x
  2.         if(huart->Instance == USART1){, A  I4 Q9 @! Y" v6 l# R
  3.                 Rx_Flag = 1;
    $ X3 H  S  u0 G+ y  V
  4.         }
    5 f' \1 F7 c4 u
  5. }
    $ T# [* _* P! y7 M9 \/ X+ N
  6. ( P# J4 H4 M3 a! f
  7. void UART_Proc_EOC(){
    ' Z4 T3 ]6 C2 i
  8.         static int trans_state = 0;
    * d/ }6 z2 W. t
  9.         if(Rx_Flag){) r0 `8 z$ [7 Z/ s5 q% ?0 @9 Z9 m
  10.                 Rx_Flag = 0;) d3 o8 h6 A+ j( V0 c
  11.                 switch(trans_state){
    8 Z" t; y+ ]' d+ ?
  12.                         case 0:/ {. z( P2 X. |# _8 n% B% X0 n& {" r
  13.                                 if(RxTemp == TRANS_CHAR)//如果接收到的字符是转义字符
    & d& v0 _* Q, k2 b! a; Y
  14.                                         trans_state = 1;//就让其标志为1
    4 p' |3 d; z5 y
  15.                                 else if(RxTemp == END_CHAR){//如果接收到的字符是结束符8 R: _$ u& w2 `5 X5 h+ H6 Q) I, G
  16.                                         Update_Flag = 1;//就意味着本次接收已经结束- v! `  ^; P& I/ r( h; {$ o: k% L  ^
  17.                                 }5 B% Y5 c2 f) C5 c
  18.                                 else {7 q5 J% D. n0 Z8 J4 K
  19.                                         RxBuf[RxCount++] = RxTemp;//如果接收到的是数据,就把该字符放到数组里5 |/ U, @, N: [  @# x9 c
  20.                                 }$ {, j3 E" P$ ?6 u! B
  21.                                 break;6 z0 x; b" g# N2 @5 I: H8 [) l
  22.                         case 1://当接收到的字符是转义字符或者结束字符
    ! G* T& e2 h5 @; B" @2 G
  23.                                 if(RxTemp != END_CHAR){//是转义字符但不是结束字符
    # o9 g% t8 K0 J# Q$ t
  24.                                         RxBuf[RxCount++] = TRANS_CHAR;//此转义字符是数据,要将他写进数组
    * Z% C! X( ?" @: B* p2 B* Z
  25.                                         RxBuf[RxCount++] = RxTemp;. Q+ `. d4 W+ ~; h2 [
  26.                                 }( |' g) ~0 C" e+ w& f3 }& E9 \
  27.                                 else {& {7 ]+ `$ g7 S8 W+ \' i9 l6 B0 m5 M0 p
  28.                                         RxBuf[RxCount++] = RxTemp;) m- l8 T7 U* E% v
  29.                                 trans_state = 0;
    8 N; U2 r( j" {) F" m8 W
  30.                                 break;
    , O5 M9 A$ ?7 i' c2 K- g9 y  Z
  31.                 }
    ) ?* a9 R$ R+ O- p, l) E1 |
  32.         }" U+ U$ g! ~6 D7 R
  33.         if(Update_Flag == 0){//表明还没有遇到结束字符,仍需要继续接收中断
    5 n- l5 K- m7 ^
  34.                 HAL_UART_Receive_IT(&huart1, &RxTemp, 1);* S! ]7 m. G3 M
  35.         }
    . T$ G; E4 ^% n! ^' c8 M3 u
  36. }
复制代码
7 s- x. ~3 R, w# P3 n$ c
三、采用空闲中断的方式(字符串基本上是连续发送,一旦空闲实践大于某个时间,就认为这串数据接收完了),适用于不定长的接收# g' t6 p1 \) C( h) h* S: j2 W, }

* c. G3 T! M) c) H①常规配置
4 x* y; Z' W4 d) H  Z8 a/ n
6 m. T" L/ c8 X0 n  e9 u
119179ed10bb435a8d2805200a5d11c0.png
1 G9 t3 n5 b1 G; K3 A7 U4 z8 j4 ~2 r+ J9 ]& V
②中断的方式
7 F, x5 b3 ~. c1 l# W% k# f4 H' ]: I0 C% W3 n; z
2cadacd22b5448ee8007ad8f903801f1.png 6 `9 C& C( U8 h

: w" A' T4 X) W1 a# l

+ P5 R7 k/ }1 }& J& O 函数中
) H* r* n8 d' ]. t0 N! J! t0 {    在中断模式下接收一定量的数据,直到接收到预期数量的数据或者发生空闲中断4 J. m- z* v/ a7 f# w  [: G  ~
    HAL_UART_ReceiveToIdle_IT(&huart1, (uint8_t *)USART_RxBuf, Rx_Len);//IDLE使用0 L1 Y8 @: |9 D* }7 E8 w0 Y

! D& n$ N7 _, Q! `, F1 [( g* O写上这个函数表明接收端已经开启了空闲中断) F  x; K- M, G/ r( J( T
" Z1 {9 h2 l- m& [* h5 M
四、DMA接收,适合接收大量的数据,一般用在报文(协议)的传输,找完整的报文(有格式)
' C% I3 T& d- R# [9 k5 c————————————————7 e" D! }0 t3 E
版权声明:想要优秀点儿
+ r# L3 o2 y0 T8 ?* g% B2 f, P8 v3 c0 F5 z
赞 收藏 评论0 发布时间:2023-3-2 13:08

举报

0个回答

所属标签

相似技术帖

官网相关资源

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