免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7208 | 回复: 2
打印 上一主题 下一主题

请问如何用MSComm发送16进制数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-14 09:56 |只看该作者 |倒序浏览
用MSComm->Output发送一个字符后,接收端总是得到这个字符的ASCII值,我想收发均是16进制数,请问如何才能实现它?
补充:比如我发送的字符是ae,它就是16进制数0xae.现在接收到的却是0x61和0x65两个十六进制数,也就是a和e的ASCII码值.

论坛徽章:
0
2 [报告]
发表于 2007-06-14 11:26 |只看该作者
现在是这样写的,但是还是有些问题:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        AnsiString str=Memo1->Text;
        AnsiString SubStr,SendStr;
        char value;
        for(int i=1;i<str.Length();i+=3)
        {
                SubStr=str.SubString(i,i+2);
                value=StrToInt(SubStr);
                SendStr=AnsiString(value);
                Label1->Caption=SendStr;
                MSComm1->Output=StringToOleStr(SendStr);
        }
}

论坛徽章:
0
3 [报告]
发表于 2007-06-15 10:14 |只看该作者
发送之前自己做一下转换,字符串ae本质上其16进制就是0x6165,这是两个字节,而你需要转换成0xae一个字节。数据传输过程中并不会改变数据本身,你发送什么就会接收到什么,发送的数据具体什么格式是要我们自己来决定的。要做转换必须弄明白不同类型的数据在内存中具体是如何保存的。

我不懂c++,只能给一个c的实现函数,可以自己相应修改一下
char *str2hex(char *dest, const char *src)
{
        char *tmp = dest;
        unsigned char a;
        int i = 0;
       
        while ('\0' != src[i])
        {
                switch (src[i])
                {
                        case '1':
                        case '2':
                        case '3':
                        case '4':
                        case '5':
                        case '6':
                        case '7':
                        case '8':
                        case '9':
                        case '0':
                                a = src[i] - '0';
                                break;
                        case 'A':
                        case 'B':
                        case 'C':
                        case 'D':
                        case 'E':
                        case 'F':
                                a = src[i] - 'A' + 10;
                                break;
                        case 'a':
                        case 'b':
                        case 'c':
                        case 'd':
                        case 'e':
                        case 'f':
                                a = src[i] - 'a' + 10;
                                break;
                        default:
                                printf("wrong char %c\n", src[i]);
                                exit(0);
                                break;
                }
                if (0 == i++ % 2)
                        *dest = (a << 4) & 0XF0;
                else
                        *dest++ += a & 0X0F;
        }
       
        return tmp;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP