; 我用arduino串口给电脑发这个10,收到的是3130
MsgBox % Chr(0x31) Chr(0x30)   ; 10的16进制数值

; 要先变成4位数,让首位的0不会消失
tmp := 2.333374
MsgBox % Format("{:04X}", 0xFFFF & Round(tmp*1000))

; 问:负值补码会算吗?  答:最好用位运算吧, 这样如果不是int就不管用了
tmp := -285+65536
MsgBox % RegExReplace(Format("{:04}", ToBase(tmp, 16)), "(\w\w)(\w\w)", "$2 $1")

; 示例一
num := -285
cpl := 0xffff & num    ; 把num变成双字节数字
MsgBox % Format("{:x} {:x}", 0xff & cpl, cpl >> 8)

; 示例二【解释转换情况】0xffff就是把数字的长度限制为16位,ahk的负数都是64位的
num := -285
MsgBox % Format("{:x}`n{:x}`n{:x}", num & 0xff, num & 0xffff, num & 0xffffffff)

; 问:这样应该不需要区分正数负数吧    正数的补码还是他自己   答:不需要
; MsgBox % Format("{:#4x}", 0xffff & -285)    ; 初版写法【参考】

; 问:补码怎么反过来算,比如-799补码为FCE1,知道FCE1,怎么得到-799
MsgBox % NumGet(num := Chr(0xfce1 & 0xffff), "short") ; 反过来用有符号类型读取, ahk没有专门的类型转换方式, 比较绕
; MsgBox cast('ushort',0xfce1,'short')  ; V2写法,V1没cast

; ======================= 做个记录,用途不明 ==========================
; 解析方法
b := RegExReplace(Read_Data, ".{6}(.+)", "$1") ; 将前六个字符去掉:modbus地址,功能码,回的字节数
; b := RegExReplace(b, "(.{4})", "$1") ; 高低字节颠倒(根据报文协议确定是否颠倒)
; b :=RegExReplace(b, "(\w\w)(\w\w)", "$2$1") ; 高低字节颠倒(根据报文协议确定是否颠倒)
b := RegExReplace(b, "(.{4})", "0x$1-") ; 将字符每4个分成一组,并添加0x前缀和-后缀(方便添加到数组)
c := StrSplit(RTrim(b, "-"), "-") ; 添加进数组
MsgBox % ToBase(c[13],10)/10 ; 转成10进制并除以10
return


ToBase(n,b) {
  return (n < b ? "" : ToBase(n//b,b)) . ((d:=Mod(n,b)) < 10 ? d : Chr(d+55))
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。