!高分请问【关于PB使用MsComm32.ocx控件输出16进制数的有关问题】
!!!高分请教【关于PB使用MsComm32.ocx控件输出16进制数的问题】
我记录了日志 通过串口传出16进制变成
0x0A 0x1A 0x2A 0x3A 0x4A 0x5A 0x6A 0x7A 0x3F 0x3F
前面的都是好好的
最后两个 不知道为什么就变成转换成0x3F了
我记录了日志 通过串口传出16进制变成
0x73 0x76 0x78 0x79 0x3F
通过我检测发现 16进制的字符 79 以前输出的都可以用
等到 16进制 80 输出又变成 0x3F
总结:
一个16进制字符
如果是一个字母 一个数字 组合的 肯定不行
如果是两个数字的组合 只要前面那个数字超过8 又不行了
高手请教这是怎么回事
串口输出16进制数据到底该怎么处理
------解决方案--------------------
String ls_parm , ls_16jz
Int li_10jz
ls_parm = "0A1A2A3A4A5A6A7A8A9A"//16进制字符串 每两位是一个16进制字符
For i = 1 To Len(ls_parm) step 2
ls_16jz = Mid(ls_parm,i,2)
li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制
ls_output = ls_output + Char(li_10jz)
Next
ole_1.object.output = ls_output
gf_writelog(ls_output)//记录日志 用Minihex软件查看输出的16进制是多少
问题出在这两行代码上
li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制
ls_output = ls_output + Char(li_10jz)
------解决方案--------------------
不知你的PB是什么版本,因为7A转为10进制是122,8A转为10进制是138,超过了char的范围
------解决方案--------------------
char的范围是128,超过这个数就不好用了
你是按单字节输出的,单个字节最多是127,转成十六进制就是7F,你想输出8F,肯定不行,你可以分成两个字节来处理,你试试以下代码
ls_parm = "0A1A2A3A4A5A6A7A8A9A"//16进制字符串 每两位是一个16进制字符
For i = 1 To Len(ls_parm) step 2
ls_16jz = Mid(ls_parm,i,2)
li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制
if li_10jz > 127 then
ls_output += char(gf_hextodec(mid(ls_parm, i, 1)))
ls_output += char(gf_hextodec(mid(ls_parm, i, 2)))
else
ls_output = ls_output + Char(li_10jz)
end if
Next
------解决方案--------------------
我是楼主
我的帐号也黑了,通过邮箱也找不回密码,今天已经向****发邮件
叫他们人工找回了
我昨天还用得好好的,真晕
------解决方案--------------------
PB12.5中有byte数据类型,用byte类型吧,不要用char了。
------解决方案--------------------
------解决方案--------------------
这个和pb无关,pb支持unicode,估计ocx对unicode处理有问题。ocx可以别的方式输入吗,一般有text和16位码的方式。你试着别用文本输入方式。
------解决方案--------------------
------解决方案--------------------
如果帐号被盗,请试一下找回方式
http://topic.****.net/u/20111223/21/2DF1EFC5-5C8A-4517-993B-6FD0817C248F.html
- C# code
String ls_parm , ls_16jz Int li_10jz ls_parm = "0A1A2A3A4A5A6A7A8A9A"//16进制字符串 每两位是一个16进制字符 For i = 1 To Len(ls_parm) step 2 ls_16jz = Mid(ls_parm,i,2) li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制 ls_output = ls_output + Char(li_10jz) Next ole_1.object.output = ls_output gf_writelog(ls_output)//记录日志 用Minihex软件查看输出的16进制是多少
我记录了日志 通过串口传出16进制变成
0x0A 0x1A 0x2A 0x3A 0x4A 0x5A 0x6A 0x7A 0x3F 0x3F
前面的都是好好的
最后两个 不知道为什么就变成转换成0x3F了
- C# code
String ls_parm , ls_16jz Int li_10jz ls_parm = "7376787980"//16进制字符串 每两位是一个16进制字符 For i = 1 To Len(ls_parm) step 2 ls_16jz = Mid(ls_parm,i,2) li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制 ls_output = ls_output + Char(li_10jz) Next ole_1.object.output = ls_output gf_writelog(ls_output)//记录日志 用Minihex软件查看输出的16进制是多少
我记录了日志 通过串口传出16进制变成
0x73 0x76 0x78 0x79 0x3F
通过我检测发现 16进制的字符 79 以前输出的都可以用
等到 16进制 80 输出又变成 0x3F
总结:
一个16进制字符
如果是一个字母 一个数字 组合的 肯定不行
如果是两个数字的组合 只要前面那个数字超过8 又不行了
高手请教这是怎么回事
串口输出16进制数据到底该怎么处理
------解决方案--------------------
String ls_parm , ls_16jz
Int li_10jz
ls_parm = "0A1A2A3A4A5A6A7A8A9A"//16进制字符串 每两位是一个16进制字符
For i = 1 To Len(ls_parm) step 2
ls_16jz = Mid(ls_parm,i,2)
li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制
ls_output = ls_output + Char(li_10jz)
Next
ole_1.object.output = ls_output
gf_writelog(ls_output)//记录日志 用Minihex软件查看输出的16进制是多少
问题出在这两行代码上
li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制
ls_output = ls_output + Char(li_10jz)
------解决方案--------------------
不知你的PB是什么版本,因为7A转为10进制是122,8A转为10进制是138,超过了char的范围
------解决方案--------------------
char的范围是128,超过这个数就不好用了
你是按单字节输出的,单个字节最多是127,转成十六进制就是7F,你想输出8F,肯定不行,你可以分成两个字节来处理,你试试以下代码
ls_parm = "0A1A2A3A4A5A6A7A8A9A"//16进制字符串 每两位是一个16进制字符
For i = 1 To Len(ls_parm) step 2
ls_16jz = Mid(ls_parm,i,2)
li_10jz = gf_hextodec(ls_16jz) //先把16进制转换成10进制
if li_10jz > 127 then
ls_output += char(gf_hextodec(mid(ls_parm, i, 1)))
ls_output += char(gf_hextodec(mid(ls_parm, i, 2)))
else
ls_output = ls_output + Char(li_10jz)
end if
Next
------解决方案--------------------
我是楼主
我的帐号也黑了,通过邮箱也找不回密码,今天已经向****发邮件
叫他们人工找回了
我昨天还用得好好的,真晕
------解决方案--------------------
PB12.5中有byte数据类型,用byte类型吧,不要用char了。
------解决方案--------------------
------解决方案--------------------
这个和pb无关,pb支持unicode,估计ocx对unicode处理有问题。ocx可以别的方式输入吗,一般有text和16位码的方式。你试着别用文本输入方式。
------解决方案--------------------
------解决方案--------------------
如果帐号被盗,请试一下找回方式
http://topic.****.net/u/20111223/21/2DF1EFC5-5C8A-4517-993B-6FD0817C248F.html