我真的很难以正确的方式做到这一点。我花了几天时间搜索,我似乎无法找到一个直接的答案/解释。任何帮助将不胜感激!
注意:如果用于此应用程序,则将定位命令发送到伺服驱动器。用于串行输出的字符串数组的格式是伺服驱动器所需的格式。
所以,这是我的功能:
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 ??
答案 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个字节(最后一个字节)。