小编rit*_*888的帖子

如何通过蓝牙正确地将数据流式传输到Android

我正在开发一个应用程序,它从DAQ读取数据,通过蓝牙传输数据.数据包大小可以改变,采样率(1Hz - 512Hz)也可以改变,并且我能够使用缓冲器循环并从设备读取数据.

我的问题是,当数据包大小和采样率变化时,如何正确处理数据?如何确定缓冲区大小?

目前我只是打开一个套接字,打开一个输入流,然后使用while循环(当套接字打开== true)从流中读取并处理数据(简单解码,而不是一个无关的任务).

例如,数据包中有23个字节,此时我的采样率非常低,为1Hz.我有一个256字节的缓冲区,这意味着它不会在缓冲区的末尾容纳一个完整的数据包,并且我已经编写了代码以便它运行到下一个缓冲区.读取数据后,从缓冲区中获取一个数据包,进行解码并存储,执行下一个数据包等.

我应该如何流式传输,并正确操作数据?最终,我将在512Hz的44个数据包中抓取一些东西,正好在蓝牙传输限制,我希望能够尽可能有效地处理它,并在进程中丢弃数据包时显示错误等.

TL; DR:如何使用缓冲区和/或中断正确地传输数据.

android bluetooth serial-communication data-stream

7
推荐指数
0
解决办法
1073
查看次数

用于不同大小阵列的 UART DMA

将 MPLAB X 1.70 与 dsPIC33FJ128GP802 微控制器一起使用。

我有一个应用程序,它以不同的采样率(一个为 50Hz,另一个为 1000Hz)从两个传感器收集数据,两个传感器数据包的大小也不同(一个是 5 字节,另一个是 21 字节)。到目前为止,我一直使用手动 UART 传输,如下所示:

void UART_send(char *txbuf, char size) {
    // Loop variable.
    char i;

    // Loop through the size of the buffer until all data is sent. The while
    // loop inside checks for the buffer to be clear.
    for (i = 0; i < size; i++) {
        while (U1STAbits.UTXBF);
        U1TXREG = *txbuf++;
    }
}
Run Code Online (Sandbox Code Playgroud)

不同大小的数组(5 或 21 字节)被发送到这个函数,它们的大小和一个简单的 for 循环遍历每个字节并通过 UART tx 寄存器 U1TXREG 输出它。

现在,我想实现DMA来减轻传输大量数据时对系统的压力。我已将 …

c microcontroller pic dma mplab

5
推荐指数
1
解决办法
3955
查看次数

蓝牙与C++和winsock

我发现用C++获取有关蓝牙通信的信息非常困难.具体来说,我想避免使用任何第三方库,我只想连接到已经与我的计算机配对的设备.

设备已输入密码,可在我的设备和打印机下的"显示蓝牙设备"中找到.我正在使用Windows 7和visual studio 2013专业版进行C++开发.

我有一些示例代码(从这里http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedotherprotocol4k.html),这显示在我的蓝牙无线电的信息,然后显示设备信息和它似乎运作良好.虽然它打印出已经与计算机配对的每个蓝牙设备,但不是那些在范围内的设备,但可能是我误解了代码的假设.

我一直在浏览蓝牙参考页面(http://msdn.microsoft.com/en-us/library/windows/desktop/aa362930%28v=vs.85%29.aspx)并且所有功能都只是为了设置蓝牙无线电可用性和其他类似的事情; 根本没有连接到找到的设备的迹象.

我必须遗漏一些东西,在谷歌搜索时使用错误的关键词,因为我没有发现任何关于连接蓝牙设备的事情!

如果有人有任何建议,代码或链接,那将是伟大的!我可以使用串行功能(非常容易)连接到我的设备,但我必须手动输入它注册的COM端口,这不是非常用户友好.我想扫描并选择,或输入蓝牙设备名称,然后以这种方式连接.

干杯

编辑:

BitBanks的回答指出了我正确的方向.在任何套接字请求之前,唯一缺少的是WSAStartup请求:

WORD wVersionRequested;
WSADATA wsaData;
int err;

/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
    /* Tell the user that we could not find a usable */
    /* Winsock DLL.                                  */
    printf("WSAStartup failed with error: %d\n", err);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

c++ serial-port bluetooth visual-studio wsastartup

4
推荐指数
1
解决办法
1万
查看次数

从另一个类的线程更新Android UI

我在这里看到了几个问类似问题的问题,但我还没有看到合适的答案.许多人已经询问如何从线程更新UI,但它们几乎总是与UI在同一个类中.

我要做的是从另一个类中创建的线程更新UI.我已经看到了所有的建议,比如async,handler,runnable等......但是我在单独的类中实现它们时遇到了麻烦.

我试图保持我的UI类最小化,只处理与GUI的交互,例如当用户按下按钮时.现在,我在新类中创建了一个新线程,它连接到蓝牙设备,但我想将UI线程中的一个按钮从"连接"按钮更改为"断开"按钮(即更改从创建蓝牙插座到关闭它的按钮).

这样做的一般方法是什么?我是否认为这一切都错了,应该在一堂课中拥有一切?在'main'UI类和其他类/线程之间进行交互的正确方法是什么?

理想情况下,我希望能够进行其他UI交互,因此一些允许在UI类之外进行其他UI更改的解决方案将非常棒!

multithreading android asynchronous handlers runnable

3
推荐指数
1
解决办法
9778
查看次数