c++ - 串口时不时收到奇怪的数据
问题描述
我使用 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 接收更多数据并且它工作得很好(没有像现在这样的奇怪行为)。
解决方案
解决方案:我必须添加这 3 行:
dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;
PurgeComm(hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR);
Sleep(ARDUINO_WAIT_TIME);
我认为第一行可以防止那些奇怪的字符通过串口,第二行会刷新缓冲区,以防那些奇怪的字符在第一行之前通过。
推荐阅读
- javascript - 为什么我的推送到数组函数返回为空?
- maximo - 获取已保存资产查询列表作为值的动态域?
- c++ - Sobel算法无库,灰度输出
- verilog - Implementing between sequential and combinational logic in HDL
- ios - 如何使用 API 模型数据数组显示 tableview 部分
- java - 为什么执行 Prepared Statement 时会出现 java.sql.SQLSyntaxErrorException?
- python - 使用不同热强度在 Python 中生成热图
- android - 无法在 Kotlin 中实例化活动 ComponentInfo
- javascript - Chrome扩展检测用户是否在内容脚本中登录到任何网站
- java - Native Android:应用程序崩溃时调用通知