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

基于stm32解决校验和计算问题

[复制链接]
攻城狮Melo 发布时间:2023-3-14 17:16
常用的通信中,经常会有一些校验方法,比如DHT22的单总线协议。* x/ x! B3 v) [+ m/ B- y+ X

% v# ^1 M$ z  G- w4 k$ w: ? 20181124194632337.jpg
1 I9 O5 c9 s5 Y  e$ S  X& [0 ?+ M+ g  F
根据参考手册,只需要计算
' a( r8 C  ?7 Z
  1. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    6 ?4 H- I) i  {+ q2 |* c1 f! B
复制代码

4 o, R: Q$ @- Q就可以了,但是!!!
% {( c3 ~: X3 X  Y4 y4 @. [- W$ i+ A9 Y
对于stm32来说,其计算结果可能不是想象中的那样,举个例子,buf0-4的值都为0x80,那么和就是0x200,至少对于stm32来说,结果是0x00000200,而buf[4]的值是0,那么0x200和0相等吗?& o, X+ |! u4 X
所以这个判断不成立,就得不到我们想要的值。# E7 n" I6 t. M7 z9 ^
只需要在判断计算的时候加一个变量强制转换,或者对256取模就可以了。
* Y$ T8 p, o  `  S6 O
  1. if((u8)(buf[0]+buf[1]+buf[2]+buf[3])==buf[4])9 v* J; r1 o7 @" P7 c: q6 d
  2.         {4 r8 h5 J$ `! M8 m: d- X% ^9 I
  3.             *humi=(buf[0]*256+buf[1])/10;
    5 \2 Q# Y# o/ M. Q" D& d+ g( S
  4.             *temp=(buf[2]*256+buf[3])/10;
    2 j/ t2 n8 o1 U& n
  5.         }
    ; q9 k% @% ]" w, P5 o6 e5 x+ W
复制代码
  1. if(((buf[0]+buf[1]+buf[2]+buf[3])%256)==buf[4])
    ) i% A$ h" z8 T9 H+ n- q! G
  2.         {
    & `* _$ F0 |8 i7 ~
  3.             *humi=(buf[0]*256+buf[1])/10;
    . I8 f$ r; P* o4 ^, q
  4.             *temp=(buf[2]*256+buf[3])/10;
    ' T3 v) ?& u3 _. ^! w8 A7 O; I) h
  5.         }
    1 z: j, v5 [5 V, ?
复制代码

* f! u, Q* V- s3 u$ J- S* _————————————————
. Q5 x# j* @! [& D5 @版权声明:小盼你最萌哒
" @1 g& w1 D+ G! a0 V5 k如有侵权请联系删除- K- x' X- k# P$ p9 B
7 \* n" [* H2 m0 F0 z. e& ~0 k
' K/ y; R/ L. m0 S* _* {# q
7 R. e& }! M$ s- q, |6 {/ y  @
赞 收藏 评论0 发布时间:2023-3-14 17:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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