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 メソッドではないことがわかりました。
なぜこれが起こっているのか、誰にも考えがありますか? そのせいで文字通り髪を抜いています。