我一直通过蓝牙将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)。
如果有人能够了解为什么会发生这种情况,我一定会很感激!
答案 0 :(得分:0)
操作系统在接口上发送"收到的新字节"随时都有。如果您发送,请说出字符串" Hello" (5个字节),它可以(并且通常这样做)只是在你收到5个字节时通知你,但是不能保证。它可以通知您前两个字节,然后是其他三个,或3-2,甚至1-1-1-1-1。
这就是为什么你应该看到ReadFile
的返回值,我想这会给你实际的读取字节数,然后循环直到你读取你需要的每个字节为止。
我们不知道你的节目的实际输出是什么,但我敢打赌,每当你找到一些" 5-4-3-2-1"他们配对的方式总和恰好是6 ..
无论如何,你说你需要一个低延迟系统"。然后避免以文本格式(6字节)打印它,但使用二进制模式(对于65536以下的任何数字,您只需要两个字节)。
再见