打印

自定义通信协议,将十进制数转换成十六进制数,并保存在字符数组中。

[复制链接]
1733|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
youngyu|  楼主 | 2019-9-25 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tianxj01| | 2019-9-25 17:06 | 只看该作者
你要问的可能是BCD转16进制吧。
所谓BCD,是指10进位的2进制数。由4个bit组成一个BCD位。紧凑的BCD码是这样的  0X98 ,0X12,可以直接读出来=9812(十进制),不紧凑的,每8位代表一个码。
当然,另外一种则是明码10进制数,也就是ASC的0-9明码发送的数据。
原则其实很简单,高位BCD吗*10+低位BCD码,更高位数的则*100  *1000。全部加起来就是16进制数据。
对于ASC字符的明码10进制数据,则多做一步将读取的字符-0x32,可以直接将ASC字符转换为0-9的数字,再用上面的方法,处理成为16进制数据即成。

使用特权

评论回复
评论
youngyu 2019-9-25 17:21 回复TA
比如:int value = 16677234;所对应的十六进制数为FE7972 char value[10]; value[0] = '0x23'; ***此处为将int 型的数据转换成为十六进制数 char value[] = {0x23,0x21,0x45,0x34,0x00,0x00,0xfe,0x79,0x72,0x00} 这种形式,因为第一次弄,不太清楚到底是十进制转16进制还是,BCD转16进制 将其发送给下位机 
youngyu 2019-9-25 17:14 回复TA
大佬能不能加个微信,或者QQ 
板凳
tianxj01| | 2019-9-25 17:31 | 只看该作者
说清楚你输入的格式
int 12345678  PC端的,内部其实存储的就是16进制数。
如果你是一个数值串 BCD[10]={0x00,0x01,0x02---,0x09};就按照我上面说的处理就可以了。输出格式应该是串行传输数据,每字符8bit的对吧。

使用特权

评论回复
地板
youngyu|  楼主 | 2019-9-25 17:47 | 只看该作者
tianxj01 发表于 2019-9-25 17:31
说清楚你输入的格式
int 12345678  PC端的,内部其实存储的就是16进制数。
如果你是一个数值串 BCD[10]={0x ...

我还是不太理解您说得意思。我再说一下我的问题
输入是10进制数,int型的数据,本来是float型的数据,想着可能更不好处理,此时直接将设备传过来的数据,强转为int
比如:int data = 16677234;
      我的想法是将其先转换为data 对应的十六进制。data的十六进制是:FE7972
     本来想着使用itoa()函数将其转换成为十六进制数,缓冲区为str[10],但是这个函数将十六进制数保存是每一个数保存一个字节。     比如:FE7972 ,此时如果使用这个函数,直接会将其转换成为 str[1] = F,str[2] = E,str[3] = 7这种形式,并不能将十六进制数的
    每两位保存下来。如:str[1] = '0xFE'

此时的data这个数据在通信协议中处在中间的位置,然后十六进制的每两位当作一个字节数据,然后直接发送给下位机程序,
直接发送给电机()

以这种形式 char value[] = {0x23,0x21,0x45,0x34,0x00,0x00,0xFE,0x79,0x72,0x00}

使用特权

评论回复
5
zyj9490| | 2019-9-25 18:49 | 只看该作者
这类似于MODBUS-ASCII格式,

使用特权

评论回复
评论
zyj9490 2019-9-27 17:25 回复TA
@youngyu ,那不是挺简单的事,弄明白此协议的特点,反正主机是你,接收响应而已。 
youngyu 2019-9-27 16:45 回复TA
使用的就是采用MODBUS—ASCII码格式的PLC电机,此时就是上位机采用的是直接将电机的数据(十进制数)转换成为16进制数,发送给PLC电机,直接使电机转动。 
6
icecut| | 2019-9-26 08:59 | 只看该作者
你啥都不干就是对的. 越做越错. 因为你看到的10进制,是假的. cpu里面本来就是hex

使用特权

评论回复
评论
luofeng2g 2019-9-27 18:02 回复TA
就是这个理 
youngyu 2019-9-27 16:42 回复TA
请问这是怎么回事呢? 
7
zyj9490| | 2019-9-27 17:54 | 只看该作者
youngyu 发表于 2019-9-25 17:47
我还是不太理解您说得意思。我再说一下我的问题
输入是10进制数,int型的数据,本来是float型的数据,想着 ...

找出帧头和帧尾,从帧尾向上二字节就是LRC校验码,从开始进行计算校验码是否跟帧中的校验码是否一致。一致,从ASCII字节向RTU转换的过程,每个字节扣0X30就是变成HEX字节,再进行二个字节一组组成一个字节。生成从机地址,功能码,数量,数据的帧的过程。

使用特权

评论回复
8
icecut| | 2019-9-27 23:36 | 只看该作者
步子大了总会扯了蛋,你先看看modbus之类协议是怎么设计的.看明白了再去搞自定义.
基础不好得话,还是需要看看公开课里我的视频,至少能知道自己哪里需要补一下课本知识.

使用特权

评论回复
9
叶春勇| | 2019-10-5 10:50 | 只看该作者
可以用sprintf或snprintf函数,你百度下。
就是将整数转换成ascii码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝