C++应用程序只有在关闭时才以串行方式发送数据

C++ application send data on serial only when closed

本文关键字:方式发 数据 应用程序 C++      更新时间:2023-10-16

使用本指南/class(http://playground.arduino.cc/Interfacing/CPPWindows)我写了一个小应用程序,将串行端口上的数据发送到Arduino。(稍后将在更大的项目中添加)

int _tmain(int argc, _TCHAR* argv[]) {
    Serial* SP = new Serial(argv[1]);
    char outcomingData[256];
    int dataLength = 255;
    int sendData;
    while (SP->IsConnected()) {
        strcpy_s(outcomingData, argv[2]);
        sendData = SP->WriteData(outcomingData, dataLength);
        printf("%s", outcomingData);
    }
    return 0;
}

问题是,只有当我关闭应用程序或通过析构函数删除SP时,才会发送数据。我该怎么解决这个问题?有没有一个变通方法或其他方法可以添加到类中?

很可能您的数据被缓存,因此在~Serial中调用CloseHandle之前,它实际上不会写入串行设备。您可以通过在对CreateFile的调用中指定FILE_FLAG_WRITE_THROUGH来避免这种缓存行为,从而使文件创建看起来像:

//Try to connect to the given port throuh CreateFile
this->hSerial = CreateFile(portName,
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
        NULL);

如果这不起作用,还有FILE_FLAG_NO_BUFFERING,但这可能会对写入设备的数据的对齐造成限制。


如果你想保持正常的缓冲行为,你可以添加一个Serial::Flush方法,它调用FlushFileBuffers来迫使Windows将它缓存的任何数据写入设备:

void Serial::Flush()
{
    FileFlushBuffers(this->hSerial);
}

然后,您可以在SP->WriteData(...)之后调用SP->Flush(),以确保Windows的缓冲区被刷新到设备。这将允许您进行多次小写入,而不必刷新每一次,从而可能提高性能。


顺便说一句,我想对你在这里使用new提出质疑。它似乎并不是真正需要的,SP可以在本地构建:

Serial SP(argv[1]);