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