我正在将一些软件移植到 Windows 7/8 并遇到了一些障碍。有问题的代码最后一次更新是在 1997 年左右,是用 C++ 编写的。一个是用 VC++ 编写的,另一个是在 Borland C++Builder 中完成的(我现在使用的是 RAD Studio 2009),并使用 Async Pro。我已经将这两个项目都更新到了最新版本,并在 Win7 下构建,它们分别工作得很好。这两个应用程序都在与我的雇主制造的设备进行通信,但每个应用程序都收集不同的数据。它们都被降级为由 Java 应用程序调用的后端程序。
我现在遇到的问题是:用 VC++ 编写的程序能够毫无问题地与设备通信,直到我运行使用 Borland/Async Pro 编写的程序。之后,它可以成功打开端口,我看到 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();
我花了大部分时间在谷歌和 StackExchange 上搜索,并没有真正找到任何与这个问题非常相似的东西。大多数人的问题似乎是他们的 Async Pro 应用程序将在端口关闭时挂起。
我怀疑 VC++ 和 Async Pro 应用程序,但我不知道实际上是哪个问题,因为:
- 当我没有运行 Async Pro 应用程序时,VC++ 应用程序可以工作,并且
- 在 Async Pro 应用程序运行后,我尝试过的其他应用程序似乎运行良好。
我还怀疑目标设备被 Async Pro 应用程序留在了某种奇怪的状态,但是重启它应该可以解决这个问题。
我在这里做错了吗?还有什么我应该测试的,或者缺少某种终结或初始化代码吗?在 XP 和早期版本的 Windows 中运行良好但已修复或删除的东西?
我还没有尝试在 Windows 8 上运行这些应用程序中的任何一个,因为我的开发机器是 Windows 7。当我朝着这个方向前进时,是否还有其他需要注意的问题?
谢谢!
编辑:当有问题的端口是 FT232 或我的笔记本电脑底座中的串行端口时,就会发生这种情况。
编辑2:问题已解决。原来是握手问题。