1

Mac から Bluetooth 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