有没有办法从离子蓝牙模块正确读取原始数据?

时间:2019-09-13 14:35:46

标签: angular typescript cordova ionic-framework bluetooth

我正在尝试通过离子蓝牙串行从设备读取原始数据。设备在每次传输时向应用发送506字节,并在应用响应为“ OK”时等待应用响应,设备随后发送506字节。

有时,该应用在一次传输中未收到506字节,这很奇怪,因为设备正在发送506字节(已确认)。由于某些原因,该应用程序未收到506个字节。它仅接收其中的一小部分,然后丢弃或遗漏的任何内容将随后发送。每506个字节都有CRC,有时CRC失败(这很好),但是当应用要求重新发送最后506个字节时,CRC将再次失败。但是设备没有任何问题(已确认)。我的假设是,当数据到达ionic / Cordova中的蓝牙缓冲区时,发生了某些事情。

我的问题是我在这里做错了什么?我可能无法正确读取数据吗?有没有人遇到过这类问题?

我尝试过的事情: 我尝试添加时间延迟,然后才开始要求数据。那根本没有用。我尝试让设备从头开始重新启动发送数据的过程,但这也不起作用。

async getBTRawData(): Promise<any> {
        let result = new Array();

        const res = this.bluetoothSerial.subscribeRawData().subscribe((data) => {
            let buffer = new Uint8Array(data);

            console.log("buffer items: ", buffer);

            buffer.forEach((item) => {
                result.push(item);
            });

            // this.bluetoothSerial.clear().then(data => {
            //     console.log("Is buffer clear before reciving new messages?:", data);
            // });
        }, err => {
            console.log("err: ", err);
        });

        return result;
    }


我希望每次都能获得506个字节而不会造成任何损失,因为手机和设备彼此相邻。我知道CRC是否失败一两次,但是重新发送应该可以解决该问题。如果506字节在被应用程序接收时没有分成大块,那就太好了。

编辑:数据如下:Raw data

Edit2:这是蓝牙序列读取数据的方式: Data from bluetooth serial

Edit3:来自订阅的原始数据:enter image description here

1 个答案:

答案 0 :(得分:0)

@ T.J Crowder感谢您的指导。是的,由于数据是流,因此我必须使用observable才能从设备读取数据。现在一切正常。