C++应用程序只有在关闭时才以串行方式发送数据
C++ application send data on serial only when closed
使用本指南/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]);
相关文章:
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 我可以使用哪种数据结构来处理这种方式
- 打印从SQLite3数据库检索的数据C++与命令行中相同的方式
- 如何以"union-like"方式更改C++向量的数据类型
- DLL共享数据的推荐方式是什么
- C++中数据初始化的不同方式
- 使用 QT C++过滤大数据的最佳方式
- 优化使用 C++ 查询 SQLite DB 中超过 5000 万条数据记录的方式
- 数组数据以错误的方式遍历 Python/Matlab
- 这种抽象模板矩阵类数据类型的方式好吗?
- 返回二进制数据的通用方式,而无需原始指针
- 写单发'if'最优雅的方式
- 二进制文件中的某些数据如图所示,并以奇怪的方式显示OS
- 以面向对象的方式解析自定义数据包
- 实时在语言之间流水线传输或以其他方式传输数据
- Socket.io在IE11中以突发方式传输数据
- 最有效的方式转换数据帧到矩阵,反之亦然
- C++应用程序只有在关闭时才以串行方式发送数据
- Boost ptime:如何以浏览器在http请求的header内发送的方式格式化数据