Winapi GetCommState失败,代码为87

Winapi GetCommState失败,代码为87,winapi,boost-asio,handle,Winapi,Boost Asio,Handle,GetCommState失败,错误代码为87 此系统调用可以与任何类型的串行端口一起使用吗?我有一张RS422 USART卡。端口可以配置为同步或异步。我将其配置为异步,并使用boost:asio。我在单步执行代码时注意到了失败,并在下面的boost文件中找到了代码。我把它拿出来放在我的main中,并在它之前调用CreateFile。我得到了一个好的句柄(句柄不是无效的句柄值)。我无法让它成功返回。有什么想法吗?我打电话给串行卡技术支持,他们告诉我这个电话应该可以用 这是我的密码: using

GetCommState失败,错误代码为87

此系统调用可以与任何类型的串行端口一起使用吗?我有一张RS422 USART卡。端口可以配置为同步或异步。我将其配置为异步,并使用boost:asio。我在单步执行代码时注意到了失败,并在下面的boost文件中找到了代码。我把它拿出来放在我的main中,并在它之前调用CreateFile。我得到了一个好的句柄(句柄不是无效的句柄值)。我无法让它成功返回。有什么想法吗?我打电话给串行卡技术支持,他们告诉我这个电话应该可以用

这是我的密码:

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;
}

如果您在*NIX平台上,请检查/usr/include/errno.h(它可能有一个#include for/usr/include/sys/errno.h)并查看与返回代码匹配的内容。因为您使用的是Windows,所以必须访问MSDN。错误代码87:

ERROR_INVALID_PARAMETER 87  One of the parameters was invalid.

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

这似乎不是针对Boost的。Asio,您是否可以添加一些其他标签以吸引更多的观众查看该问题?嗨,山姆。我尝试了GetCommState,这将是完美的。但我无法将其添加为标签。我在这里没有足够的地位。Asio是相关的,因为该调用嵌入在一个Boost库文件中。Sean,您所说的dcb参数在某种程度上是正确的。但是因为我没有技术背景来给出正确的答案,我只会评论你的,也许其他人或者你可以给出正确的答案。我的卡有一个特殊的设备驱动程序。在调用GetCommState之前,我必须设置某些设置。然后它成功了。因此,仅仅检索句柄,然后调用GetCommState对我来说不起作用。我不会输入示例代码,因为IOCTL参数是特定于设备的。这对任何人都没有用。谢谢你的跟进。我相信有人会在
GetCommState
引用中找到有用的东西。