我有一个项目,我将数据发送到Android手机。我通过串口获取数据到rfduino,然后将这些数据发送到手机。 首先,我有20个字节的数据块。我使用“Serial Event”设置一个标志,然后在主循环中读取和发送数据。根据rfduino工作人员的建议,串行波特率为9600。
现在我有40个字节的数据。 Rfduino读取40个字节的串行数据并分两部分发送(参见代码)。每个部分的第一个字节是用于在不同分组之间进行干扰的标识符。 在一些成功的传输之后,数据变得腐败。通常,一旦传输开始出现故障,我必须重新启动连接以获取正确的数据。
这是代码的基本概念:
void loop() {
if (mData)
{
mData = false;
Serial.readBytes(data, 40);
while(!RFduinoBLE.send(&data[0], 20));
while(!RFduinoBLE.send(&data[20], 20));
}
}
void serialEvent(void) {
mData = true;
}
我用逻辑分析仪检查了串行数据,没有任何问题。我还用wireshark检查了变速箱。两个20字节块都在相同的连接间隔内发送。一段时间后,RFduino发送的数据就会损坏。
当我省略第二个数据包并且只发送20个字节时,问题就不会发生。
我认为,无线电干扰了串口的读取。我尝试在while(RFduinoBLE.radioActive);
之前使用Serial.read
,但我认为数据在此之前已缓冲。所以这并没有改变任何事情。
此外,我试图将发送功率降至最低,没有任何改进。
我也尝试了不同的连接间隔。我每128ms有一个新数据。这限制了最大值。连接间隔。所有的改变都没有任何帮助。
我已经读过BLE无线电优先级需要大约5-6ms并且有一个6字节的数据缓冲区。使用9600波特率,此缓冲区溢出。
我还没有找到这些语句的来源,但是将波特率降低到4800似乎改善了错误数据的问题。 这仍然不是令人满意的数据速率,并且仍然会发生传输故障。不是那么经常,但仍然。
我已经没有想法如何解决这个问题,并希望任何想法! 我的意思是每128ms发送40个字节一定是可能的......那不是那么多。
我已经在RFduino论坛上发布了这个问题 - 直到现在才回答 - 我想知道是否有人遇到与RFduino类似的问题。