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

标签 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 slider 读取整数值,或者从存储在数组中的 csv 读取一组预定义的整数。

底线,我需要输入整数并将它们转换为十六进制格式,并且能够在每个字符数组位置存储 2 个十六进制数字。如果您对其进行硬编码,则效果很好。我在创建一个可以接受函数参数并正确转换它的变量时遇到问题它想要占据多个位置(即 char[5] 数组)。我认为这是因为它正在尝试转换为 ASCII??

最佳答案

您所需要的是:

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 已经是数字,因此您可以按原样使用它们。

关于c - 如何在 char 数组的单个索引位置存储 2 个十六进制数字(1 个字节)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26228515/

相关文章:

c - 动态内存分配和指针?

c - 无需借助 `limits.h` 即可确定最大整数值的安全方法

c - 制作文件以写入来自serialPort的所有信息

node.js - 如何将字符串转换为十六进制nodejs

html 颜色与图像颜色

c - arm 链接器在函数调用中使用的 'veneer' 是什么?

c - libpq-fe,无法选择 INT8

javascript - 为什么 0x80000000 和 0x80000000 比 0 低

delphi - 串口连接超过6个设备有限制吗?

arduino - 与arduino的慢速串行通信?延迟近 1 秒?