; x6 c, x. C! u2 N) | 当设备接外部传感器的时候,通过数据采样,需要在UI界面上将数据实时显示出来。这里以UI界面中的温度和胎压监测为例。还是以UI的MVP结构为基础,通过上位机串口发送数据,模拟实际传感器的测量数据,在UI界面上显示。0 v% x. G k* c# {% Z p9 q; ` t
OK,UI界面图如图1和图2所示:
0 j% M' t" _$ ~8 g3 e
/ r0 w4 d: y! a3 _% {
图11 V* X) s6 Q3 y! }4 I
/ _; e* [ T# {6 \2 K( T; j图2
% t: q( A' d$ i# A( G; y/ e; m要在UI程序架构里增加UART通讯,先在原理图中查找相应的接口,如图3所示:$ D! R6 N1 s# {! w
% I& e' D# f7 r4 H; ?图3
9 b! T9 v2 O6 FUSART3正好可以应用,连接好线,测试发现,这个接口不能使,原因尚未找到。然后找到了USART2接口,需要调整下短接电阻,如图4所示:
5 F" Y8 `" k ~; u4 P
9 b8 }! V5 N/ J, F1 |
图46 q1 @/ n8 \% J* V
经测试,这个接口是可以使用的。所谓有坑也得迈过去。
* p8 P5 @% \' H" M
0 a3 m0 T; v9 ]
6 C0 y5 M$ \/ R G定义中断,如下所示:% c+ h3 q+ B0 v! p9 e+ y
- TouchGFX_SetUartRxByte(aRxBuffer);1 U# q% R! }, i
- HAL_UART_Receive_IT(&huart2, &aRxBuffer,1);
复制代码 ' N9 L! j5 Q% y
D9 y1 m# W. G6 L* r" ?
因为程序使用的是FreeRtos的架构,所以还得在默认任务里添加中断。
. F5 u `0 l! y/ c! n+ F9 c5 P% i' f8 I E8 N
- f6 L! B, P; K" d/ S简单测试一下,能收到数据,没有问题。下面修改UI的代码。; u8 \) w. F' _0 E) \% i$ f
8 p0 y7 F9 L' H# b/ ]& r2 f* {" A: x) ^" w
现在Model.cpp 中完成数据采集,如下:
) \% [, I7 j J( {! R$ V3 w- void Model::setUartRxByte(uint8_t b)
1 x* ]; w1 n, w* } z2 P, i1 } - {! K& ~( O: A2 i- l3 j% w4 v
- uartRxByte = b;1 A/ g' `1 A7 O- W# V
3 v1 U. R1 d; y" A7 v! y1 j- if (modelListener != nullptr)3 d0 L- F' N. W5 d( v
- {% B _4 _- g- K" m* `
- modelListener->onUartRxByteChanged(b);' `# M# E7 M4 V2 h0 F5 P* V
- }6 w, ^( t/ z y$ y# i4 j& S: T# l
- }
复制代码 0 J& i$ o7 `$ G2 U' u% h8 ?
9 j# F3 R5 ^5 l5 C' gpresenter.cpp 完成中转,如下所示:" U- {) B2 i% M* ?7 G3 i% J
- void Screen1Presenter::onUartRxByteChanged(uint8_t b)
, K& ?$ A& ?2 G+ m" c& s" r- M - {
& B% ]" }8 m2 m. T5 J; t" C - view.updateRxValue(b);
% |: q" S( P& I& c - }
复制代码 X, H* l9 q1 D" x
4 z( {. G8 U8 l% J$ Q0 s
然后在view.cpp 中完成数据显示,如下所示:* j9 x8 Z( n1 t% `
- void Screen1View::updateRxValue(uint8_t b) k) {' N' K! Q2 h5 {
- {
p: k5 N3 @- h4 o - // static uint8_t lastValue = 255; // 不可能出现的初始值
6 t6 F: O' t( T/ g - [0 k( @8 h2 {# |( k/ v
- // if (b != lastValue) // 只有变化才更新 UI7 B) Q2 a8 L! a4 N! ]
- // {
& O- J' A' s/ \' T: Q8 L - // lastValue = b;
v( U% b# r* Q" A- u, R5 k! x$ f( D
' L+ r M6 b; w, k, u0 y" V- // Unicode::snprintf(textArea5Buffer, TEXTAREA5_SIZE, "%d", b);
* R ]- B N2 p: s* G5 A5 g - // textArea5.invalidate();
, g1 `/ j8 k: c" T0 ]1 R: h7 o - // }
F) p0 w, y' |# r( Y; _ - Unicode::snprintf(textArea5Buffer, TEXTAREA5_SIZE, "%d", b);" \# @+ s! m+ l7 b2 P/ ]& c
- textArea5.invalidate();
. S- r' v& [1 o. u% [ - }
复制代码 3 M6 K' L& _. d- \8 e3 a
% C0 j/ _- Q! B" D5 L8 S9 m最后的效果,通过串口助手发送数据,如图5:3 k8 s" b) {( i$ }
! K# _* k1 L/ X; Y1 t6 s图5& h- h* r, |8 {- ^* ~8 S/ _
UI界面实时显示,如图6所示:+ f v% Z6 j3 n, I: @
" \" x8 e8 o' p3 ` t+ ?$ }0 E
图6" w2 i1 i4 `' Q% c
实际操作还是很好玩的,如图7所示:
& I+ P# ]4 v1 x/ O' K1 [/ a. K; b
s1 ?" H* `7 P5 u }! B1 ~8 h
图7
7 N8 U- K8 M( g& G |
完整做完之后可以打包发创客秀哈
<br /> <br />
好的