【问题标题】:communication device class (CDC) issue with ReadRead 的通信设备类 (CDC) 问题
【发布时间】:2014-02-28 17:02:03
【问题描述】:

我正在尝试使用readfile 函数从 WinCE 环境中的 CDC 设备读取数据。

BOOL WINAPI ReadFile(
  _In_         HANDLE hFile,
  _Out_        LPVOID lpBuffer,
  _In_         DWORD nNumberOfBytesToRead,
  _Out_opt_    LPDWORD lpNumberOfBytesRead,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

我想知道readbuf 的大小限制是多少。我发送 256 字节数据块 100 次,ReadFile 中的参数 lpNumberOfBytesRead 第一次尝试返回 173 字节,其他 99 次返回 0。请让我知道我错过了什么。 'writebuf' 的大小限制是多少?下面是打开端口的代码

    BOOL PortOpen()
    {
    Close();

ComPort = INVALID_HANDLE_VALUE;
    COMMTIMEOUTS ct;




ComPort=CreateFile (TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE,
                     0, NULL, OPEN_EXISTING, 0, NULL);



if (ComPort != INVALID_HANDLE_VALUE) {

    dcb.DCBlength = sizeof (dcb);
    GetCommState (hLocal, &dcb);
    dcb.BaudRate = 115200;
    dcb.fParity = FALSE;
    dcb.fNull = FALSE;
    dcb.StopBits = ONESTOPBIT;
    dcb.Parity = NOPARITY;
    dcb.ByteSize = 8;
    SetCommState (ComPort, &dcb);


    ct.ReadIntervalTimeout = 0;
    ct.ReadTotalTimeoutMultiplier = 0;
    ct.ReadTotalTimeoutConstant = 0;
    ct.WriteTotalTimeoutMultiplier = 0;
    ct.WriteTotalTimeoutConstant = 0;
    SetCommTimeouts (hLocal, &ct);

}

【问题讨论】:

  • 如果您使用 CreateFile 打开设备发布该代码。
  • 显示 ReadFile() 循环
  • 为什么您认为要从设备读取的字节数超过 173 个字节?为什么你认为你已经等待了足够长的时间来发送所有字节?

标签: c++ c windows-ce cdc


【解决方案1】:

可以使用 SetCommTimeouts API 配置 ReadFile 操作的超时,您确定您的代码没有调用它吗?在这种情况下,返回的字节数可能会有所不同,具体取决于您设置的不同超时参数。

【讨论】:

  • 我认为问题在于写入,我正在写入 256 字节,应该有四个 64 字节的数据包,前两个数据包我得到 ack,问题从第三个数据包开始,我我得到 nake 的次数比我在第 31 次尝试时得到 ack 的次数还要多 30 次。
【解决方案2】:

感谢您的回复!我的问题已经解决了。 WindowCE不支持重叠I/O,读写需要在分离的线程中。另外,为了避免竞争条件,我使用了信号量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多