我正在将几个软件移植到Windows 7/8并且遇到了一些麻烦。有问题的代码最后一次更新于1997年左右,并用C ++编写。一个用VC ++编写,另一个用Borland C ++ Builder编写(我现在使用RAD Studio 2009),并使用Async Pro。我已将这两个项目更新并在Win7下构建,并且它们可以单独工作。两个应用程序都与我的雇主制作的设备进行通信,但每个应用程序都收集不同的数据。它们都被降级为Java应用程序调用的后端程序。
我现在遇到的问题是: 在运行使用Borland / Async Pro编写的程序之前,用VC ++编写的程序能够毫无问题地与设备通信。之后,它可以成功打开端口,我看到TX上的活动LED亮起,但应用程序实际上并没有与设备通信。此时,Async Pro应用程序,Tera Term和Java应用程序都能够在同一端口上与设备通信。如果我使用的端口是USB串行桥,我可以拔掉它并恢复VC ++应用程序的功能。我试图通话的设备上的循环电源什么也没做。
下面是打开com端口的VC ++代码。据我所知,这就是你应该如何在VC ++中打开COM端口。
std::ostringstream comCatString;
comCatString << "\\\\.\\COM" << (int)CommPort;
// Try to open the serial port.
hPort = CreateFile( TEXT(comCatString.str().c_str()),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if ( hPort == INVALID_HANDLE_VALUE )
{
//clear strstream
comCatString.str("");
comCatString.clear();
comCatString << "Unable to open serial port " << (int)CommPort << ". \r\nError: " << GetLastError();
MessageBox (NULL, TEXT(comCatString.str().c_str()), TEXT("Error"), MB_OK);
return FALSE;
}
以下是从AsyncPro应用程序关闭com端口的代码:
ApdComPort->Open = false;
ApdComPort->DonePort();
我花了大部分时间在Google和StackExchange上搜索,并没有真正找到任何与此问题相似的内容。似乎大多数人的问题是他们的Async Pro应用程序将挂起端口关闭。
我怀疑VC ++和Async Pro应用程序,但我不知道实际上是哪个问题因为:
我还怀疑目标设备被Async Pro应用程序留在了某种奇怪的状态,但是在它上面循环上电可以解决这个问题。
我在这里做错了吗?还有其他我应该测试的东西,还是某些缺少的终结或初始化代码?什么在XP和早期版本的Windows中运行良好,但已被修复或删除?
我还没有尝试在Windows 8上运行这些应用程序中的任何一个,因为我的开发机器是Windows 7.当我朝这个方向前进时,是否还有其他问题需要注意?
谢谢!
编辑: 当有问题的端口是FT232或笔记本电脑底座中的串口时,会发生这种情况。
编辑2: 问题解决了。原来是一个握手问题。