1

我正在将一些软件移植到 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 应用程序,但我不知道实际上是哪个问题,因为:

  1. 当我没有运行 Async Pro 应用程序时,VC++ 应用程序可以工作,并且
  2. 在 Async Pro 应用程序运行后,我尝试过的其他应用程序似乎运行良好。

我还怀疑目标设备被 Async Pro 应用程序留在了某种奇怪的状态,但是重启它应该可以解决这个问题。

我在这里做错了吗?还有什么我应该测试的,或者缺少某种终结或初始化代码吗?在 XP 和早期版本的 Windows 中运行良好但已修复或删除的东西?

我还没有尝试在 Windows 8 上运行这些应用程序中的任何一个,因为我的开发机器是 Windows 7。当我朝着这个方向前进时,是否还有其他需要注意的问题?

谢谢!

编辑:当有问题的端口是 FT232 或我的笔记本电脑底座中的串行端口时,就会发生这种情况。

编辑2:问题已解决。原来是握手问题。

4

0 回答 0