使用以下代码,我试图将三个浮点值转换为单个NSData对象,然后我可以通过串口传输。
float kP = [[self.kPTextField stringValue] floatValue];
float kI = [[self.kITextField stringValue] floatValue];
float kD = [[self.kDTextField stringValue] floatValue];
float combined[] = {kP, kI, kD};
NSData *dataPackage = [NSData dataWithBytes:&combined length:sizeof(combined)];
[self.serialPort sendData:dataPackage];
问题在于它似乎并不能很好地发挥作用。每当我使用" sizeof()" C函数,它告诉我" dataPackage"即使3个浮点值总共12个字节,也只有8个字节。我收到了Arduino的数据。它看到了进入的字节,但它们根本不易读。我不认为这是Arduino方面的问题(但谁知道?)。
任何帮助将不胜感激!我不是CS专业,只是一个生物专业,而且我从未以正式的方式学过这些东西,所以如果我的问题很荒谬,我很抱歉。我花了几个小时在网上搜索这个问题并且找不到任何有帮助的东西。
编辑:事实证明这段代码完全正确。我在arduino方面做了一个简单的错误,通过使用struct而不是union来获取字节并将它们转换回浮点数。
对于可能处于类似困境的其他人来说,从串口发出的字节转换成功的成功方法如下:
(在实施文件的顶部)
union {
float pidVals[3];
byte bytes[12];
} pidUnion;
(内循环)
if (Serial.available() > 11) {
for (int i = 0; i < 12; i++) {
pidUnion.bytes[i] = Serial.read();
}
}
//Now, you can get access to all three floats of data using pidUnion.pidVals[0], pidUnion.pidVals[1], etc.
这可能不是传输数据的最佳或最可靠的方式。没有纠错机制或数据包结构。但它确实有效。我想你可能想找到一种方法来创建一个数据包和一个哈希字节,以确保另一方面的所有数据都是正确的,但是这段代码并没有这样做。
答案 0 :(得分:1)
您的代码存在多个问题。
首先,您不想在文本字段上使用stringValue。你想要text属性,这是一个字符串。
所以第一行应该是这样的:
float kP = [self.kPTextField.text floatValue];
其次,在C中,一系列事物是一个指针。
的数据类型float combined[]
和
float *combined
是完全相同的。两者都是&#34;指向float&#34;的指针。
所以这段代码:
NSData *dataPackage = [NSData dataWithBytes:&combined
length: sizeof(combined)];
组合前不应该有&符号。它应该是:
NSData *dataPackage = [NSData dataWithBytes:combined
length: sizeof(combined)];
第三,重要的是sizeof(combined)
,而不是sizeof(dataPackage)
。
表达式sizeof(dataPackage)
将告诉您变量dataPackage的大小,该变量是指向NSData对象的指针。您必须在64位设备上运行,其中指针为8个字节。
要测试NSData对象中数据的长度,您需要使用length属性来询问它:
NSLog(@"sizeof(combined) = %d", sizeof(combined)";
NSData *dataPackage = [NSData dataWithBytes:&combined
length: sizeof(combined)];
NSLog(@"dataPackage.length = %d", dataPackage.length";
两个日志语句都应显示值12。