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

C++ application send data on serial only when closed

使用这个 guide/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时才会发送数据。我怎样才能解决这个问题?我可以将解决方法或其他方法添加到 class?

很可能您的数据已被缓存,因此在 ~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]);