1

我无法将数据从我的 mac 发送到蓝牙 arduino 板。

看来正在发送的数据在某种程度上是畸形的,因为 arduino 看到从 mac 发送的每个字节的随机值。

NSData 创建

我创建了一个具有以下结构的 NSData 对象。

字节 0:uint8_t 标签字节 1:uint8_t 操作码字节 2:uint8_t 终止符

例如 0x01 0x20 0xff

在致电之前,我会检查数据是否存在任何格式错误

[self.channel writeSync:&data length:[data length]];

数据总是好的。

Arduino 串行读取

出于调试目的,我执行以下操作 - 对于 Arduino 板接收的每个字节,它将返回 32 个字节的数据,其中传入字节作为第一个字节,然后是 30 0x00,然后是一个终止字节。见下文。

void serialEvent() {
  if (Serial.available() > 0) {
    int readByte = Serial.read();
    sendMessage(readByte);
  }

void sendMessage(byte tag) {
  byte message[32];
  message[0] = tag;//tag;

  int maxCounter = 32;
  for( int counter = 1; counter < maxCounter; counter++ ) {
    if( counter < maxCounter - 1 ) {
      message[counter] = op_reservered;
    } else {
      message[counter] = op_terminator;
    }
  }

  Serial.write(message, 32);
}

我已经使用 CoolTerm 对此进行了测试,并且效果很好。

IOBluetooth 读取数据

当收到 Arduino 响应时,我将其添加到缓冲区中,然后将其解析为 32 字节块

- (void)parseData:(NSData *)data
{
    uint8_t terminator;
    [self.data getBytes:&terminator range:NSMakeRange(kBufferLength - 1, sizeof(uint8_t))];

    if( terminator == op_terminator ) {
        uint8_t tag;
        uint8_t opcode;

        [self.data getBytes:&tag range:NSMakeRange(0, sizeof(uint8_t))];
        [self.data getBytes:&opcode range:NSMakeRange(1, sizeof(uint8_t))];
        [self.delegate connection:self deviceDidSendData:self.data];
    }
}

然而,无论我尝试多少次,第一个字节 - “标签” - 似乎都是一个随机数。然而,这个随机标签总是能被 16 整除。

帮助!

我已经尝试将硬编码值从 ardunio 发送到 mac,并且这些值可以完美传输,所以我知道这不是 arduino Serial.write 方法不正确。

有谁知道为什么会发生这种情况?因为它,我真的把我的头发拉了出来。

4

0 回答 0