我知道这个问题已被多次提出过.我对着那里我得到几个问题hex bytes通过serial communication在ubuntu.我编写了一个C代码,它读取所有数据并显示它.它运行正常,因为我用很多字符串测试它.我还有另一个运行Windows的系统和一个名为的软件Docklight.这个软件给我十六进制字节,我需要在我的应用程序中接收它.十六进制字节如下所示:
FF AA 2E 0F CC 0D
我通过零调制解调器电缆连接了两个系统.现在要打印十六进制字节,我们需要%02X在printf语句中包含.这样做,它给了我一个警告format ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned char *’.我搜索了这个并替换了它%p.这是代码:
unsigned char buf[255];
res = read(fd,buf,255);
buf[res]='\0';
printf("data: %p\n",buf);
Run Code Online (Sandbox Code Playgroud)
printf语句的输出是data: 0x603380.我打开buf变量来查看下面的确切值:
Name : buf
Details:"ÿª.\017Ì\n", '\0' <repeats 248 times>
Default:0x603380 <buf>
Decimal:6304640
Hex:0x603380
Binary:11000000011001110000000
Octal:030031600
Run Code Online (Sandbox Code Playgroud)
现在我真的不知道为什么它会显示随机字符,例如ÿª.\017Ì\nprintf的输出可能是因为它将所有字节组合成一个并显示其十六进制等效值.
我真的需要每个字节保存像FF和AA在数组中.但就目前而言,我想到了第一次展示它.可能是什么问题.为什么它不显示十六进制字节.任何人都可以给我这方面的建议.我还需要知道,当我们通过串行传输十六进制字节时,接收端应该如何接收它.它应该保存为int或strings.谢谢.!
这是一个基本的C问题,你给printf()一个指针并期望它显示你的十六进制转储,好像它是一个字符串.这不是它的工作方式.
你应该做这样的事情:
unsigned char buf[255];
res = read(fd,buf,255);
// AN HEX BUFFER IS NOT A STRING DO NOT TERMINATE IT
// buf[res]='\0';
printf("data: ");
for (int i = 0; i < res; ++i)
printf("%02x ", (int)buf[i]);
printf("\n");
Run Code Online (Sandbox Code Playgroud)
printf 的选项%p用于转储指针ADDRESS,而不是指针指向的内容.