如何在char数组的单个索引位置存储2个十六进制数字(1个字节)?

时间:2014-10-07 04:23:20

标签: c serial-port hex

我真的很难以正确的方式做到这一点。我花了几天时间搜索,我似乎无法找到一个直接的答案/解释。任何帮助将不胜感激!

注意:如果用于此应用程序,则将定位命令发送到伺服驱动器。用于串行输出的字符串数组的格式是伺服驱动器所需的格式。

所以,这是我的功能:

int myFunc(int valOne, int valTwo, int valThree)
{
    char bufferA = 0;
    char bufferB = 0;
    char bufferC = 0;

    sprintf(bufferA, "%02x", valOne);
    sprintf(bufferB, "%02x", valTwo);
    sprintf(bufferC, "%02x", valThree);

    char servoCommand[13] = {0};
    servoCommand[0] = 0x01;
    servoCommand[1] = 0x11;
    servoCommand[2] = 0x09;
    servoCommand[3] = 0x02;
    servoCommand[4] = 0x00;
    servoCommand[5] = 0x02;
    servoCommand[6] = 0x01;
    servoCommand[7] = 0x02;
    servoCommand[8] = bufferA;
    servoCommand[9] = bufferB;
    servoCommand[10] = bufferC;
    servoCommand[11] = 0x00;
    servoCommand[12] = 0x04;

    //.... Code to write to serial port goes down here (this part works fine)

    return 0;
}

COM下的输出需要看起来像这样: 01 11 09 02 00 02 01 02 40 42 0F 00 04

每两位数对是一个字节(因为每个数字在技术上都是半字节?)

这三个变量来自另一个函数的输入,该函数从UI滑块读取整数值,或从存储在数组中的csv中读取一组预定义的整数。

最重要的是,我需要输入整数并将它们转换为十六进制格式,并且每个字符数组位置能够存储2个十六进制数字。如果您硬编码,这可以正常工作。我在创建一个可以接受函数参数的变量时遇到了麻烦,并且正确地转换它想要占用多个位置(即char [5]数组)。我想这是因为它试图转换为ASCII ??

2 个答案:

答案 0 :(得分:1)

您只需要:

servoCommand[8] = valOne;
servoCommand[9] = valTwo;
servoCommand[10] = valThree;

你不需要转换任何东西。字符串01 11 09 02 00 02 01 02 40 42 0F 00 04只是发送的实际数值的人类表示。由于valOne / Two / Three已经是数字,你可以按原样使用它们。

答案 1 :(得分:0)

您可以安全地将代码编写为:

servoCommand[8] = (valOne & 0xFF);
servoCommand[9] = (valTwo & 0xFF);
servoCommand[10] = (valThree & 0xFF);

这将从4个字节的整数值中精确占用1个字节(最后一个字节)。