串口不时收到奇怪的数据

时间:2019-07-03 09:18:36

标签: c++ visual-studio serial-port

我使用的是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);
}

构建并运行时,控制台会向我显示以下内容: enter image description here

或者有时是这样: enter image description here

任何想法为何?我遵循了本指南的所有说明:http://bd.eduweb.hhs.nl/micprg/pdf/serial-win.pdf,并且尝试了很多事情(更改TimeOut,要接收的字节数,...)

此致

编辑:我忘了告诉你Arduino完全没问题。我使用Matlab接收更多方式的数据,并且可以完美运行(没有像现在这样的奇怪行为)。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您似乎已经得出结论,显然是由于反复试验在各处添加随机的内容,简单的做法并不一定总能得出正确的答案。

您的Arduino上的代码会自行运行,并不断覆盖其TX缓冲区,从而破坏了数据。要解决此问题,您只需要在写完后Serial.flush(),然后添加一个短暂的延迟即可(或只需完成延迟即可)。

您从魔术师帽子中拿出的其他两行内容与您的有趣字符无关。

作为一个有趣的旁注,这是我在这里阅读问答后第一次怀疑我是由准AI机器人编写的(希望您对此表示赞赏)。