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]);
使用这个 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]);