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