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

标签 c++ arduino serial-port

使用本指南/类(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,但这可能会对您写入设备的数据的对齐施加限制。


如果您想保留正常的缓冲行为,您可以添加一个调用 FlushFileBuffersSerial::Flush 方法来强制 Windows 写入它缓存的任何数据输出到设备:

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

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


作为旁注,我会质疑您在这里使用new。它似乎并不是真正需要的,SP 可以在本地构建:

Serial SP(argv[1]);

关于C++应用程序仅在关闭时才在串行上发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667981/

相关文章:

c++ - 如何使用 ZeroMQ 唤醒线程

Ruby - 在 Mac 和 Ubuntu 上执行不同的代码

c++ - 为 Arduino 创建一个库

c++ - 等待 COM 端口上的数据?

java - Ubuntu : javac package gnu. io不存在

java - RXTX 双向串口通信第一次运行后不发送数据

c++ - 为什么将 const ptr 分配给 const 引用时没有出现编译错误?

c++ - 如何在 Qt 应用程序中替换 'gluOrtho2d'

c++ - 如何让 LED 代码从键盘按键运行

c++ - 当派生类不能轻易将参数传递给基类时,如何调用基类的构造函数?