gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:34:23 24 4
gpt4 key购买 nike

使用本指南/类(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com