首页 > 解决方案 > 串口时不时收到奇怪的数据

问题描述

我使用 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 接收更多数据并且它工作得很好(没有像现在这样的奇怪行为)。

标签: c++visual-studioserial-port

解决方案


解决方案:我必须添加这 3 行:

dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;
PurgeComm(hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR);
Sleep(ARDUINO_WAIT_TIME);

我认为第一行可以防止那些奇怪的字符通过串口,第二行会刷新缓冲区,以防那些奇怪的字符在第一行之前通过。


推荐阅读