C ++应用程序仅在关闭时才在串行上发送数据

时间:2016-07-29 21:50:40

标签: c++ arduino serial-port

使用本指南/类(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时才会发送数据。我怎样才能解决这个问题?是否有可以添加到类中的变通方法或其他方法?

1 个答案:

答案 0 :(得分:1)

CloseHandle中调用~Serial之前,您的数据可能会被缓存,因此实​​际上并未将其写入您的串行设备。您可以通过在FILE_FLAG_WRITE_THROUGH调用中指定CreateFile来避免此缓存行为,以便创建文件如下所示:

//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的{​​{1}}方法,强制Windows将其缓存到的任何数据写入设备:

FlushFileBuffers

然后在void Serial::Flush() { FileFlushBuffers(this->hSerial); } 之后调用SP->Flush()以确保将Windows缓冲区刷新到设备。这将允许您进行多次小写操作而无需刷新每一次,这可能会提高性能。

作为旁注,我会质疑你在这里使用SP->WriteData(...)。它似乎并不真正需要,new可以在本地构建:

SP