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

【STM32H750-DK 车辆仪表】6.模拟温度和胎压监测

[复制链接]
jundao721 发布时间:2025-12-11 19:25
$ N0 o2 F) Y" x. R/ T0 A
      当设备接外部传感器的时候,通过数据采样,需要在UI界面上将数据实时显示出来。这里以UI界面中的温度和胎压监测为例。还是以UI的MVP结构为基础,通过上位机串口发送数据,模拟实际传感器的测量数据,在UI界面上显示。
! b3 W7 b) X# z- F5 TOK,UI界面图如图1和图2所示:
" k0 \$ N- w* ?2 {( p  g" Q 6-1.png
: \8 O5 W4 R& y2 m5 h3 J8 ]# [图1
, p, s% d. |1 r/ Y  O 6-2.png
1 t9 O$ r- v6 N* Y图2) b, E- R8 Q. O( D
要在UI程序架构里增加UART通讯,先在原理图中查找相应的接口,如图3所示:" l! {' S9 ^/ E& G* N4 |& {: V' |
6-4.png
8 ~, f: x7 n% N图3  o  w9 Q) O5 E5 V% j
USART3正好可以应用,连接好线,测试发现,这个接口不能使,原因尚未找到。然后找到了USART2接口,需要调整下短接电阻,如图4所示:. y* i) D' l! @. f+ P
6-5.png . D; R$ P0 ^% b, [8 j, X  Q
图46 O3 G$ c, }& f1 M# A6 N
经测试,这个接口是可以使用的。所谓有坑也得迈过去。
$ h8 Z6 j+ X- T7 J' F% V& w/ }
. ]( j6 Z# S, B9 I
定义中断,如下所示:1 f& [, q( \6 _- O/ N
  1. TouchGFX_SetUartRxByte(aRxBuffer);+ K3 H- p1 e6 I, c
  2.         HAL_UART_Receive_IT(&huart2, &aRxBuffer,1);
复制代码

) z9 _1 M' B" K( g4 w" }' E
8 W# T, c* w& @# {! o, B因为程序使用的是FreeRtos的架构,所以还得在默认任务里添加中断。! O: b3 E3 D3 t
  G& d4 N9 y. R9 o$ c" S7 [1 V% `

4 L) R, H( n7 C/ F' y简单测试一下,能收到数据,没有问题。下面修改UI的代码。
, S7 B7 K& w: \" j: [$ O9 H7 w' o$ I5 l4 A) |4 f
2 e, j+ [- t0 C. ~% S) v
现在Model.cpp 中完成数据采集,如下:7 g+ C% Q- k, B+ G! A$ `
  1. void Model::setUartRxByte(uint8_t b)
    . X# V- K5 ~* L, ^- i
  2. {
    7 }: \5 |6 {0 ^7 U
  3.     uartRxByte = b;
    - T' L" n! I7 }/ _/ M, T# K
  4. 6 S6 i+ d, r& e6 ]8 d4 s( X: p+ w
  5.     if (modelListener != nullptr)1 C& q6 q& W* s( |/ c
  6.     {3 M+ W# y5 S  j1 }. L8 ~
  7.         modelListener->onUartRxByteChanged(b);
    & C3 B4 \+ ]8 a. {! y
  8.     }& z6 ?; E4 b+ q- c% v# t; W; n
  9. }
复制代码
  h8 H7 |0 S3 g
' M% Z, B3 E: k
presenter.cpp 完成中转,如下所示:
' T' L( u# z8 Y
  1. void Screen1Presenter::onUartRxByteChanged(uint8_t b)
    6 d" B. V& y8 N( {
  2. {1 }3 _/ K! ?; D9 l0 f/ z
  3.     view.updateRxValue(b);, J: K3 Q' z+ b2 Z# g$ Q8 u4 K
  4. }
复制代码
) n) g8 b8 L$ {8 V+ G
5 ^$ n7 k8 w, j  K) G& e( M  O
然后在view.cpp 中完成数据显示,如下所示:4 J" |& S6 u5 S8 t/ e
  1. void Screen1View::updateRxValue(uint8_t b)
      F. E! _% H" P$ }) t3 C* N( L
  2. {. I$ f# W0 S5 |! p9 a& ]2 b) L
  3.     // static uint8_t lastValue = 255;   // 不可能出现的初始值5 Y: n3 Z% ^0 H; g  s

  4. # N/ p/ }4 k4 N7 P
  5.     // if (b != lastValue)               // 只有变化才更新 UI& m& A& J8 A- O! K( l8 e' \6 q1 r
  6.     // {9 ~3 L5 u. n9 R# K3 t& w7 {
  7.     //     lastValue = b;
    . D( p- \' O2 _. e% h$ L
  8. % I# z$ C. w/ \+ r" d8 a
  9.     //     Unicode::snprintf(textArea5Buffer, TEXTAREA5_SIZE, "%d", b);
    2 ]) c) D4 ~' O& S, O) s1 D" X
  10.     //     textArea5.invalidate();, _' N7 L) J) [3 \
  11.     // }
    , U( E, O! O$ S0 U. C+ v$ S
  12.     Unicode::snprintf(textArea5Buffer, TEXTAREA5_SIZE, "%d", b);
    7 n6 Z/ P0 Q! I8 ^
  13.     textArea5.invalidate();" h+ H% q0 r; L' `
  14. }
复制代码

; a" z) G/ m) E! L: C' K" y2 D; ]
最后的效果,通过串口助手发送数据,如图5:
/ j) E! w8 [! c8 `) D 6-3.png ' t: b9 V0 Q. Y( _! T  ?0 Q
图5# \& j4 M4 N: n+ v
UI界面实时显示,如图6所示:
+ {; l0 `9 A9 k$ h% C1 ]1 z5 ^' j 6-6.jpg
- x  h+ w3 g6 u2 T, p( o4 T9 @- E图6% j* k% A( B- W6 K) G
实际操作还是很好玩的,如图7所示:
0 w, G! Q3 m8 z( n: F$ @2 R8 _1 k 6-7.gif
$ W+ Z, W/ {- ^4 X' C4 a) h图7/ L& Q9 o  O8 {$ q) ?
赞 收藏 评论2 发布时间:2025-12-11 19:25

举报

2个回答
STMCU-管管 回答时间:2025-12-12 11:17:41

完整做完之后可以打包发创客秀哈

jundao721 回答时间:2025-12-12 13:39:23

STMCU-管管 发表于 2025-12-12 11:17
完整做完之后可以打包发创客秀哈

好的

所属标签

相似技术帖

官网相关资源

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