ios - 如何将 Float 转换为 NSData 字节

标签 ios objective-c arduino nsdata

使用以下代码,我尝试将三个浮点值转换为单个 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”只有 8 个字节,尽管 3 个浮点值总共应该有 12 个字节。我正在使用 Arduino 接收数据。它看到传入的字节,但它们根本不清晰。我不认为这是 Arduino 方面的问题(但谁知道呢?)。

如有任何帮助,我们将不胜感激!我不是CS专业的,只是生物专业的,我从来没有以正式的方式学过这些东西,所以如果我的问题很荒谬,我很抱歉。我已经花了几个小时在网上搜索有关此问题的信息,但没有找到任何有用的信息。

编辑:事实证明这段代码是完全正确的。我在 arduino 方面犯了一个简单的错误,使用结构而不是联合来获取字节并将它们转换回 float 。

对于可能处于类似困境的其他人,将串口输出的字节转换为 float 的成功方法如下:

(位于实现文件顶部)

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.

这可能不是传输数据的最佳或最可靠的方式。没有纠错机制或数据包结构。但它确实在紧要关头起作用。我想您可能想找到一种方法来创建一个数据包和一个哈希字节,以确保所有数据在另一端都是正确的,但这段代码没有任何这些。

最佳答案

您的代码存在多个问题。

首先,您不想在文本字段上使用 stringValue。您需要文本属性,它是一个字符串。

所以第一行应该是这样的:

float kP = [self.kPTextField.text floatValue];

其次,在C中,数组就是一个指针。

的数据类型
float combined[]

float *combined

是相同的。两者都是“浮点指针”。

所以这段代码:

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。

关于ios - 如何将 Float 转换为 NSData 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29000778/

相关文章:

ios - 导航栏后退按钮文本颜色恢复为默认值

iphone - 参数和选择器

c++ - 在 Arduino 环境中启用异常

c++ - 如何添加第三方库的路径? - Eclipse/Arduino

android - 通过 arduino 板从传感器接收数据到 android 设备的最佳方法是什么?

objective-c - iOS使我的应用程序不断在后台运行

iphone - Dropbox 显示文件修改日期

ios - 使用 NSURL 无法识别 URL 变量

iphone/ipad - 使用 Autoresize 和 addSubview 时出现问题

ios - 使用 SDWebImage 设置图像