Ram*_*mad 4 bluetooth nsinputstream nsstream external-accessory ios
我一直在尝试使用RN-42通过蓝牙2.1从设备读取数据.该设备与iPhone或iPad Mini配对,数据流短暂流动,但iOS和BT模块在几秒钟内(小于10)断开连接(取消配对).该设备输出的数据为5-10kB/s,完全符合蓝牙规范.我还注意到的一点是,当我运行函数NSInputStream,[NSInputStream read:maxLength:]时,返回的字节数总是158或更少.应用程序和硬件不会崩溃,但蓝牙只是取消配对.
即使断开连接,设备仍然会向RN42发送数据,从而降低了电子设备问题的可能性.此设置在Android设备上也可以完美运行.我可以在没有任何断开连接或崩溃的情况下流式传输数据.
我尝试过的事情......
有一点可行的是减慢数据传输速度(即小于5kB/s),因为它允许iOS和BT模块在断开连接之前保持连接并传输更长时间的数据.
#define EAD_INPUT_BUFFER_SIZE 1024
/**
* Stream delegate
*/
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
[... other cases ...]
case NSStreamEventHasBytesAvailable:
{
uint8_t buf[EAD_INPUT_BUFFER_SIZE];
unsigned int len = 0;
len = [(NSInputStream *)aStream read:buf maxLength:EAD_INPUT_BUFFER_SIZE];
if(len) {
// Read successful, process data
} else {
// Fail
}
break;
}
default:
break;
}
}
/**
* Stream delegate with polling (for better or worse)
*/
[...]
case NSStreamEventHasBytesAvailable:
{
while ([[_session inputStream] hasBytesAvailable])
{
// Read the data
NSInteger bytesRead = [[_session inputStream] read:_buf maxLength:EAD_INPUT_BUFFER_SIZE];
if (bytesRead > 0) {
// Read successful, process data
} else if (bytesRead == 0) {
// End of buffer reached
return;
} else if (bytesRead == -1) {
// Failed to read
return;
}
}
break;
[...]
Run Code Online (Sandbox Code Playgroud)
我和Microchip(收购Roving Networks的公司,他们是RN42的原始制造商)的人谈过这类问题,似乎有一个不幸的小"功能"没有记录在任何地方RN42手册.
当RN42用于与iOS设备通信时,它的通信速度不能超过2.5-3kB/s ...如果它用于与Android或计算机或其他任何设备通信,它可以35kB/s(超过SPP)传输.
其原因是RN42中的芯片功率不足,无法以iOS设备所需的格式(iAP协议)处理BT堆栈和重新打包字节.
他们建议以下选项:
我有一个礼貌的第五个建议......找一个新的Apple支持的蓝牙模块.
此外,使用4线UART通信应该有助于崩溃.
| 归档时间: |
|
| 查看次数: |
1948 次 |
| 最近记录: |