!高分请问【关于PB使用MsComm32.ocx控件输出16进制数的有关问题】
!!!高分请教
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进制数据到底该怎么处理
PowerBuilder语言基础 PowerBuilder 程序开发
Answers
String lsparm , ls16jz
Int li10jz
lsparm = "0A1A2A3A4A5A6A7A8A9A"//16进制字符串 每两位是一个16进制字符
For i = 1 To Len(lsparm) step 2
ls16jz = Mid(lsparm,i,2)
li10jz = gfhextodec(ls16jz) //先把16进制转换成10进制
lsoutput = lsoutput + Char(li10jz)
Next
ole1.object.output = lsoutput
gfwritelog(lsoutput)//记录日志 用Minihex软件查看输出的16进制是多少
问题出在这两行代码上
li10jz = gfhextodec(ls16jz) //先把16进制转换成10进制
lsoutput = lsoutput + Char(li_10jz)
char的范围是128,超过这个数就不好用了
你是按单字节输出的,单个字节最多是127,转成十六进制就是7F,你想输出8F,肯定不行,你可以分成两个字节来处理,你试试以下代码
lsparm = "0A1A2A3A4A5A6A7A8A9A"//16进制字符串 每两位是一个16进制字符
For i = 1 To Len(lsparm) step 2
ls16jz = Mid(lsparm,i,2)
li10jz = gfhextodec(ls16jz) //先把16进制转换成10进制
if li10jz > 127 then
lsoutput += char(gfhextodec(mid(lsparm, i, 1)))
lsoutput += char(gfhextodec(mid(lsparm, i, 2)))
else
lsoutput = lsoutput + Char(li_10jz)
end if
Next