我无法将数据从我的 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 方法不正确。
有谁知道为什么会发生这种情况?因为它,我真的把我的头发拉了出来。