OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4674|回复: 4

数组中的16进制值代换的求助

[复制链接]

49

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2017-11-23
在线时间
133 小时
发表于 2022-4-15 15:58:00 | 显示全部楼层 |阅读模式
1金钱
各位大神,问下,数组中的16进制元素如何用不确定的可变变量代换,请有明白的大神指导指导!!感谢!!应用情况是这样的,我最近在学习编程用Modbus RTU协议,在主站用06命令写从站单个寄存器的功能时,主站发送的命令包括从站的,站号,读写命令,操作的寄存器地址,操作的数值,CRC校验,

当我要写的从站的寄存器地址确定了,且要写入的具体数值确定了后,这一组数组的CRC校验值也就确定了,如下图所示
下图中写入的地址是1000H(16进制地址0x10. 0x00),写入的数值是5(16进制数0x00.0x05),这个值是16位值,分高8位和低8位,前高后低
疑问1,当我下次若这个地址1000H不变,而写入这个地址的数值5要变成9或者其他数值时,在程序里如何实现这个不确定的写入值呢??
           比如用个k来表示要写入的值,可这个k如何分别写入数组的高8位和低8位呢?
疑问2, 最后面的CRC校验值是根据前面的所有值来计算出来的,前面的值现在是个可变化的不确定的值,那这个CRC值又如何确定或者说如何处理呢?
请有明白的大神指点指点!!感谢!!
主站要写入的数组如下
微信截图_20220415152545.png
主站轮询操作如下
微信截图_20220415152243.png

最佳答案

查看完整内容[请看2#楼]

定义一个临时变量,把数组要用变量来代替的元素赋值给变量
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2070
金钱
2070
注册时间
2021-7-17
在线时间
647 小时
发表于 2022-4-15 15:58:01 | 显示全部楼层
定义一个临时变量,把数组要用变量来代替的元素赋值给变量
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8463
金钱
8463
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-4-15 17:08:36 | 显示全部楼层
数据存入数组:
w[0]=s>>8;//高字节
w[1]=s;//低字节
CRC当然得写个函数计算整个数组的CRC值啦,比如
  1. //--------------------------------------------------
  2. //CRC16计算
  3. //nbyte为字节数
  4. //多项式=X16+X15+X2+1

  5. //--------------------------------------------------
  6. U16 crc16(U8 *p,U8 nbyte)   
  7. {  
  8.         U16 crc=0xffff;
  9.         U8 i,d;
  10.         while(nbyte--)   
  11.         {  
  12.                 d=*(p++);
  13.                 for(i=0x01;i;i<<=1)               
  14.                 {      
  15.                         if(crc&0x1){crc>>=1;crc^=0xA001;}
  16.                         else crc>>=1;                        //数据同CRC最低位相异或
  17.                         if(d&i)crc^=0xA001;                //数据都是低位在前
  18.                 }               
  19.         }
  20.         return(crc);
  21. }
复制代码
专治疑难杂症
回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2022-4-15 17:11:52 | 显示全部楼层
这个很简单 一般协议都是这样写的 写入_16bit的值用两个_8bit的值来存储不就行了嘛 校验位不就是数组累加运算等关系嘛???
回复

使用道具 举报

49

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2017-11-23
在线时间
133 小时
 楼主| 发表于 2022-4-20 09:57:41 | 显示全部楼层
感谢大神们的指点!!
对这个CRC校验计算又多了一些了解啊,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 20:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表