前事不忘,后事之师,不忘国耻!

SAP SYBASE论坛中文社区技术服务

 找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 696|回复: 5
收起左侧

[PB10-15.X] PB12.6以十六进制方式向串口发送数据

[复制链接]
wfliu 发表于 2020-12-18 23:10:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?站点注册

x
        好长时间没用PB了,最近因有个项目,又把PB拾了起来。因本人属于保守派,所以没用安装最新版本,挑了一下,选择了12.6版,再次还特别感谢本版的@ehxz,热心解答我安装中遇到的问题。
        这次用PB向串口发送数据遇到了难题,以前用过是以文本的方式发送和接受,感觉用mscomm比较方便,使用起来也很简单,但这次以十六进制方式发送,确屡遭失败,最后才明白是自己对数据的进制格式及PB数据发送的方式没有理解透彻。这次查阅了大量资料,才慢慢理解了,根本原因是PB对内存数据的调用是短板,再就是用PB做项目,这方面使用的也比较少,大部分还是以业务数据为主。
        以十六进制方式发送数据,关键点是要用BLOB格式储存数据,个人理解,blob格式有点类似于c语言的指针,是PB对内存数据调用最直接方便的方式。
       
        把这次查阅的资料整理了一下,方便大家查阅,在此感谢@无敌三角猫、@xjdg0229、@dazizai (大自在)的帖子,受益匪浅。
       
        @dazizai (大自在)的帖子:关于PowerBuilder中的字符集问题   
        https://www.sybasebbs.com/thread-89934-1-1.html

        @无敌三角猫  串口通信程序中十六进制格式发送和接收实现  这个不是PB编写的,可参考思路

        上位机软件(MFC)发送给三轴步进电机控制器的指令是用hex方式(也就是16进制方式传送的,而不是Ascii码的形式传送的,比如说‘0’,按照Ascii码的方式传送就是48,而以hex的方式传送就是0,),
刚刚用MFC编写了一个采集和设定中央空调控制板上参数的应用程序,控制板和PC机之间通过485转串口和串口转USB电路实现通信。程序设计中碰到一个问题是PC端对发送和接收数据格式的处理,控制板可以读懂的协议是一组16进制数,如“66 03 0C 00 01 00 01 00 00 00 00 00 3C 00 3E F5 94”,PC端应用程序可以解析的也是由控制板发送的一组16进制数,而串口通信是二进制字节流进行,发送和接收缓冲区均为char型的数组,发送时如何将字符串类型的16进制数转换为对应大小的10进制数并存进缓冲数组呢?下面的函数可供参考:
HexChar函数的功能是将16进制字符由ASCII码转为相应大小的16进制数@
//也就是说利用串口调试助手,选中以Hex方式发送到的复选框,则文本框中的字符都是16进制的,在进行传送带之前需要将这些字符转化为10进制的形式,然后在进行传送,也就是HexChar()函数所实现的功能。
char HexChar(char c)
{
    if((c>='0')&&(c<='9'))
        return c-'0';//16进制中的,字符0-9转化成10进制,还是0-9
    else if((c>='A')&&(c<='F'))
        return c-'A'+10;//16进制中的A-F,分别对应着11-16
    else if((c>='a')&&(c<='f'))
        return c-'a'+10;//16进制中的a-f,分别对应也是11-16,不区分大小写
    else
        return 0x10;   // 其他返回0x10
}
Str2Hex函数的功能则是将如“66 03 ...”形式的字符串以空格为间隔转换为对应的16进制数并存放在BYTE型(typdef unsigned char BYTE)数组中,data数组作为发送缓冲数组写入串口即可。 实际应用中将BYTE数据类型修改为char。也是可以使用的。
下面的函数是将文本框中的字符串,去除空格,然后将其他的字符转换为char型数据和长度,放到数组data中,以方便下面的串口传送。
int Str2Hex(CString str, BYTE *data)
{
    int t,t1;
    int rlen=0,len=str.GetLength();
    if(len==1)
    {
        char h=str[0];
        t=HexChar(h);
        data[0]=(BYTE)t;
        rlen++;
    }
    //data.SetSize(len/2);
    for(int i=0;i<len;)
    {
        char l,h=str;
        if(h==' ')
        {
            i++;
            continue;
        }
        i++;
        if(i>=len)
            break;
        l=str;
        t=HexChar(h);
        t1=HexChar(l);
        if((t==16)||(t1==16))//判D断?为a非¤?法¤&#161;§的ì?16进?制?数oy
            break;
        else
            t=t*16+t1;
        i++;
        data[rlen]=(BYTE)t;
        rlen++;
    }
    return rlen;
}

对于接收到的数据,位于接收缓冲区的BYTE数组RecBuf中,如果要以相应大小的16进制形式显示,刚可以将数组中每一个元素以下列格式转换并放入字符串RecText中,即可实现以16进制显示。
下面函数的功能是将char的数据转换为16进制输出。
CString RecText,str;
for(int i=0;i<Rlen;i++)
    {
     str.Format("%02X ",RecBuf);//将接收到的BYTE型数据转换为对应的十六进制
     RecText.Append(str);
    }




        @xjdg0229    串口发送数据——字符串发送与十六进制发送的区别

        我们在用串口发送数据的时候首先将待发送的数据/符号转换为对应的ASCII码,然后将这些ASCII码按照二进制的方式一位一位地发送出去。

(注:以下图片来自https://blog.csdn.net/wityy/article/details/8234739





字母、数字在内存中的二进制应该按照ASCII码表对照,也就是A的ASCII码是65,十六进制是0x41,二进制内存为01000001

(内存中存的是二进制数,这8位二进制数对应的是ASC码的十进制数,上面说的十六进制0x41是中间的一个转换,没什么实际用处,它既不是内存里实际存储的可以看到的东西,也不是ASCII表里的东西)

也有博友说:“A852010100000000A91A”指的是十六进制的0~F组成的数据串,并不是指的字符串。在编程实现中,这个数据串存储在string中是需要先转化下的: [引用自 http://blog.csdn.net/xhao014/article/details/6663738 请谅解源码作者已经无从考证]



11.png 12.png 13.png



最后附上这次测试的代码。


uf_str2hex.zip

1.06 KB, 阅读权限: 10, 下载次数: 9, 下载积分: 金钱 -1

点评

非常好,图片顺序已修复。在上传后的界面,直接点击图片,可将图片直接插入到所需的地方。这样顺序就正常了。  发表于 2020-12-19 08:56
你不共享给别人,谁会共享给你?
SYBASE论坛欢迎您能交换更多好的信息,资料,代码……
富强,民主,文明,和谐;自由,平等,公正,法治;爱国,敬业,诚信,友善!
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
 楼主| wfliu 发表于 2020-12-18 23:16:30 | 显示全部楼层
图片编辑的有点乱,调了两次也没调过了,大家以数字顺序看吧,11,12,13
你不共享给别人,谁会共享给你?
SYBASE论坛欢迎您能交换更多好的信息,资料,代码……
富强,民主,文明,和谐;自由,平等,公正,法治;爱国,敬业,诚信,友善!
ehxz 发表于 2020-12-19 08:59:52 | 显示全部楼层
非常好,加精
你不共享给别人,谁会共享给你?
SYBASE论坛欢迎您能交换更多好的信息,资料,代码……
富强,民主,文明,和谐;自由,平等,公正,法治;爱国,敬业,诚信,友善!
 楼主| wfliu 发表于 2020-12-20 08:48:23 | 显示全部楼层
谢谢版主鼓励
你不共享给别人,谁会共享给你?
SYBASE论坛欢迎您能交换更多好的信息,资料,代码……
富强,民主,文明,和谐;自由,平等,公正,法治;爱国,敬业,诚信,友善!
surachai43 发表于 2020-12-27 14:46:01 | 显示全部楼层
Thanks for sharing.
你不共享给别人,谁会共享给你?
SYBASE论坛欢迎您能交换更多好的信息,资料,代码……
富强,民主,文明,和谐;自由,平等,公正,法治;爱国,敬业,诚信,友善!
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

QQ|Archiver|手机版|SYBASE论坛中文社区 ( 鲁ICP备20019049号-5 )

GMT+8, 2021-4-11 12:12 , Processed in 0.020697 second(s), 10 queries , MemCached On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表