我使用的是Arduino微控制器,其中包含最简单的代码:
void loop(){Serial.write('b');}
因此它发送恒定的“ b”流。 另一方面,我正在使用Visual Studio接收数据:
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
LPCTSTR comPort = TEXT("COM3");
int main()
{
HANDLE hSerial;
hSerial = CreateFile(comPort,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (hSerial == INVALID_HANDLE_VALUE) {
if (GetLastError() == ERROR_FILE_NOT_FOUND) {
//serial port does not exist. Inform user.
cout << "ERROR WITH COM PORT" << endl;
}
//some other error occurred. Inform user.
}
DCB dcbSerialParams = { 0 };
dcbSerialParams.DCBlength = sizeof(DCB);
if (!GetCommState(hSerial, &dcbSerialParams)) {
//error getting state
cout << "ERROR GETTING SERIAL STATE" << endl;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
//error setting serial port state
cout << "ERROR SETTING SERIAL STATE" << endl;
}
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 5;
timeouts.ReadTotalTimeoutConstant = 5;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 5;
timeouts.WriteTotalTimeoutMultiplier = 1;
if (!SetCommTimeouts(hSerial, &timeouts)) {
//error occureed. Inform user
cout << "ERROR SETTING TIMEOUT" << endl;
}
const int n = 500;
char szBuff[n + 1] = { 0 };
DWORD dwBytesRead = 0;
if (!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)) {
//error occurred. Report to user.
cout << "ERROR READING FROM ARDUINO" << endl;
}
cout << szBuff << endl;
//cout << szBuff << endl;
CloseHandle(hSerial);
}
任何想法为何?我遵循了本指南的所有说明:http://bd.eduweb.hhs.nl/micprg/pdf/serial-win.pdf,并且尝试了很多事情(更改TimeOut,要接收的字节数,...)
此致
编辑:我忘了告诉你Arduino完全没问题。我使用Matlab接收更多方式的数据,并且可以完美运行(没有像现在这样的奇怪行为)。
答案 0 :(得分:0)
解决方案:我必须添加这三行:
dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;
PurgeComm(hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR);
Sleep(ARDUINO_WAIT_TIME);
我认为第一行阻止那些奇怪的字符通过串行端口,第二行则刷新缓冲区,以防那些奇怪的字符在第一行之前通过。
答案 1 :(得分:0)
您似乎已经得出结论,显然是由于反复试验在各处添加随机的内容,简单的做法并不一定总能得出正确的答案。
您的Arduino上的代码会自行运行,并不断覆盖其TX缓冲区,从而破坏了数据。要解决此问题,您只需要在写完后Serial.flush()
,然后添加一个短暂的延迟即可(或只需完成延迟即可)。
您从魔术师帽子中拿出的其他两行内容与您的有趣字符无关。
作为一个有趣的旁注,这是我在这里阅读问答后第一次怀疑我是由准AI机器人编写的(希望您对此表示赞赏)。