GetCommState失败,代码为87

时间:2011-05-12 21:24:08

标签: winapi boost-asio handle

GetCommState失败,错误代码为87。

这个系统调用可以用于任何类型的串口吗?我有一张RS422 USART卡。端口可以​​配置为同步或异步。我将它配置为Async并使用boost:asio。我在逐步执行代码时注意到了失败,最后在升级文件中的代码中结束了。我把它拿出来放在我的主要部分,并在它之前调用CreateFile。我得到一个好的句柄(句柄不是INVALID_HANDLE_VALUE)。我不能让它回归成功。有任何想法吗?我打电话给串口卡技术支持,我被告知这个电话应该有效。

这是我的代码:

using namespace std; // For memset.
DCB dcb;
//memset(&dcb, 0, sizeof(DCB));
SecureZeroMemory(&dcb, sizeof(DCB)); // tried this from a suggestion I saw online somewhere
dcb.DCBlength = sizeof(DCB);
if (!GetCommState(hDevice, &dcb))
{
  DWORD last_error = ::GetLastError();
  CloseHandle(hDevice);
  exit(1);
 // ec = boost::system::error_code(last_error,
 //   boost::asio::error::get_system_category());
//return ec;
}

1 个答案:

答案 0 :(得分:0)

如果您使用的是* NIX平台,请查看/usr/include/errno.h(可能有/usr/include/sys/errno.h的#include)并查看与返回代码匹配的内容。由于您使用的是Windows,因此必须使用MSDN。错误代码87:

ERROR_INVALID_PARAMETER 87  One of the parameters was invalid.

我猜想GetCommState()不喜欢你的hDevice参数。如果使用memset(),则不需要调用SecureZeroMemory()。你有没有检查过dcb的所有必要参数是否都是根据hDevice设置的?