使用.cpp程序读取串行数据(通过arduino / bluetooth发送)时丢失的字节数

时间:2015-09-22 23:13:17

标签: c++ bluetooth arduino serial-port latency

我一直通过蓝牙将arduino的串行数据发送到我的电脑。这是arduino代码示例。

long interval=10;
long previousMs=0;
int k=1000;
int K=9999;


void setup() {
  Serial1.begin(115200);
}

void loop() {
  unsigned long currentMs = millis();

  if(currentMs - previousMs > interval) {
    previousMs = currentMs;   
    k=k+1;
    Serial1.println(k);
    if(k>K){
      k=1000;
    }
  }
}

这是我的.cpp代码中读取数据的相关部分。我稍微改了一下打印出读取的字节数。它应该是每次6(4位数,回车,新线),但每隔一段时间它会给5,4,3,2或1。

int read_bt(PORTTYPE port, char *buf, int bytes_to_read)
{
    COMMTIMEOUTS timeout;
    DWORD n = 0;
    BOOL r;
    FILE *fp;

    fp = fopen("C:\\Users\\Myname\\Documents\\Visual Studio 2013\\Projects\\Project2\\Debug\\BT_Constant.txt", "w+t");

    GetCommTimeouts(port, &timeout);
    timeout.ReadIntervalTimeout = MAXDWORD; // non-blocking
    timeout.ReadTotalTimeoutMultiplier = 0;
    timeout.ReadTotalTimeoutConstant = 0;
    SetCommTimeouts(port, &timeout);

    while (1){
        // Get and clear current errors on the port.
        if (!ClearCommError(fd, &dwErrors, &comStat))
            // Report error in ClearCommError.
            exit(0);

        // Get error flags.
        fDNS = dwErrors & CE_DNS;
        fIOE = dwErrors & CE_IOE;
        fOOP = dwErrors & CE_OOP;
        fPTO = dwErrors & CE_PTO;
        fMODE = dwErrors & CE_MODE;
        fBREAK = dwErrors & CE_BREAK;
        fFRAME = dwErrors & CE_FRAME;
        fRXOVER = dwErrors & CE_RXOVER;
        fTXFULL = dwErrors & CE_TXFULL;
        fOVERRUN = dwErrors & CE_OVERRUN;
        fRXPARITY = dwErrors & CE_RXPARITY;

        if (comStat.cbInQue != 0){
            // comStat.cbInQue bytes have been received, but not read

            r = ReadFile(fd,
                buf,
                bytes_to_read,
                &n,
                NULL);
        }
        fprintf(fp,"%d\n", n);
        printf("%d\n", n);

    }
} 

我考虑过分享输出文本文件,但我无法想到最好的方法。基本上它只是大量的" 6"并且在各个地方散布着1-5个。

我正在研究一个带有EEG数据的项目,因此需要非常高的分辨率和低延迟。我想知道我的任何代码是否存在问题,或者是否更可能是我使用的蓝牙模块的硬件问题(HC-05 BT 2.0EDR)。

如果有人能够了解为什么会发生这种情况,我一定会很感激!

1 个答案:

答案 0 :(得分:0)

操作系统在接口上发送"收到的新字节"随时都有。如果您发送,请说出字符串" Hello" (5个字节),它可以(并且通常这样做)只是在你收到5个字节时通知你,但是不能保证。它可以通知您前两个字节,然后是其他三个,或3-2,甚至1-1-1-1-1。

这就是为什么你应该看到ReadFile的返回值,我想这会给你实际的读取字节数,然后循环直到你读取你需要的每个字节为止。

我们不知道你的节目的实际输出是什么,但我敢打赌,每当你找到一些" 5-4-3-2-1"他们配对的方式总和恰好是6 ..

无论如何,你说你需要一个低延迟系统"。然后避免以文本格式(6字节)打印它,但使用二进制模式(对于65536以下的任何数字,您只需要两个字节)。

再见