WinAPI ReadFile返回0字节

时间:2011-05-26 12:47:40

标签: c winapi

我做错了什么或设备根本没有响应? 如何从com端口读取数据,现在我正在这样做:

hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, NULL);


Other settings ....


DWORD dwBytesCount = 0;
    unsigned char response[5] = {0};
    unsigned char command[6] = {0x0A, 0xFF, 0x03, 0x20, 0x04};
    command[5] = Crc8(command, 5);
    printf("\ncrc-8 sum is:%d", command[5]);

    if(!(WriteFile(hCom, command, 6, &dwBytesCount, NULL)) || (dwBytesCount != 6)) {
        dwErrorCode = GetLastError();
        printf("\nError in function WriteFile, error code:%ld, bytes write:%ld", GetLastError(), dwBytesCount);
        std::cin >> input;
        return false;
    }
    printf("\nwrite bytes is:%ld", dwBytesCount);

//  DWORD dwMask;
//  printf("\nWaitCommEvent");
//  if(!WaitCommEvent(hCom, &dwMask, NULL)) {
//      printf("\nError in function WaitCommEvent, error code:%ld", GetLastError());
//      std::cin >> input;
//      return false;
//  }

    for(int i = 0; i < 10; ++i) {
        printf("\nread file");
        if(!(ReadFile(hCom, response, 4, &dwBytesCount, NULL))) {
            dwErrorCode = GetLastError();
            printf("\nError in function ReadFile, error code:%ld, bytes read:%ld", GetLastError(), dwBytesCount);
            std::cin >> input;
            return false;
        }
        Sleep(100);
        printf("\nread bytes is:%ld", dwBytesCount);
    }
    printf("\nread bytes is:%ld", dwBytesCount);
    printf("\nreader response status is:%d", response[3]);
    std::cin >> input;

它读取零字节。 如果我取消注释WaitCommEvent,程序会冻结。

我在每次操作后尝试使用标志OVERLAPPED和GetOverlappedResult的版本,结果是一样的。

除了

据我所知,它无法同时连接到com端口 http://www.ms-news.net/f3608/createfile-shared-mode-doesnt-work-2057561.html

在第二个流中连接会产生相同的结果

其他设置包括:

            SetCommMask(hCom, (EV_RXCHAR | EV_RXFLAG | EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING | EV_RLSD));

            if(!(GetCommTimeouts(hCom, &timeout))) {
                printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
                std::cin >> input;
                return false;
            }

            timeout.ReadIntervalTimeout = 50;
            timeout.ReadTotalTimeoutConstant = 50;
            timeout.ReadTotalTimeoutMultiplier = 10;
            timeout.WriteTotalTimeoutConstant = 50;
            timeout.WriteTotalTimeoutMultiplier = 10;

                    //timeout.ReadIntervalTimeout = 0xFFFFFFFF;
            //timeout.ReadTotalTimeoutConstant = 1000;
            //timeout.ReadTotalTimeoutMultiplier = 0;
            //timeout.WriteTotalTimeoutConstant = 1000;
            //timeout.WriteTotalTimeoutMultiplier = 0;

            if(!(SetCommTimeouts(hCom, &timeout))) {
                printf("Error in function GetCommTimeouts error code:%ld", GetLastError());
                std::cin >> input;
                return false;
            }

        if(!(SetupComm(hCom, 128, 128))) {
            printf("Error in function SetupComm error code:%ld", GetLastError());
            std::cin >> input;
            return false;
        }

        if(!(GetCommState(hCom, &ComDCM))) {
            printf("Error in function GetCommState error code:%ld", GetLastError());
            std::cin >> input;
            return false;
        }

        ComDCM.BaudRate = 115200;
        ComDCM.ByteSize = 8;
        ComDCM.Parity = NOPARITY;
        ComDCM.StopBits = ONESTOPBIT;
        ComDCM.fAbortOnError = TRUE;
        ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
        ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
        ComDCM.fBinary = TRUE;
        ComDCM.fParity = FALSE;
        ComDCM.fInX = ComDCM.fOutX = FALSE;
        ComDCM.XonChar = 0;
        ComDCM.XoffChar = uint8_t(0xff);
        ComDCM.fErrorChar = FALSE;
        ComDCM.fNull = FALSE;
        ComDCM.fOutxCtsFlow = FALSE;
        ComDCM.fOutxDsrFlow = FALSE;
        ComDCM.XonLim = 128;
        ComDCM.XoffLim = 128;

        if(!(SetCommState(hCom, &ComDCM))) {
            printf("Error in function SetCommState error code:%ld", GetLastError());
            std::cin >> input;
            return false;
        }

        printf("success");
        std::cin >> input;

加2

我已经使用com端口模拟器测试了这段代码并且它可以工作,这意味着问题出在设备中。

感谢大家的回复和帮助

2 个答案:

答案 0 :(得分:3)

你应该稍微分解这个问题,除非其他一些海报已经发现了一个错误。

有什么事情要发送吗?如果您将tx作为范围,或连接到另一个连接了某个有效终端程序甚至HyperTerm的端口,那么命令字符是否会消失?如果在非重叠模式下运行,WaitCommEvent会阻塞,因此如果取消注释并且线程阻塞,则可能根本没有收到任何字符。可能的原因很多 - 电缆,连接器,波特率不匹配,不正确的流量控制和与RS232相关的所有其他痛苦行李。

非重叠I / O最好在它自己的一个线程中完成,但是,我认为,如果链接正常并且对等方能够响应,你应该回到这里。

RGDS, 马丁

BTW,'其他设置'在这里是我使用的订单。它适用于从W2k到W7的每个操作系统:

的CreateFile(); SetupComm(); setCommTimeouts(); setCommState(); setCommMask(); ReadWriteStuff();

马丁

答案 1 :(得分:1)

您是否已使用正确的值设置COMMTIMEOUTS结构并调用函数SetCommTimeouts?有关详细信息,请参阅:http://msdn.microsoft.com/en-us/library/aa363190。特别是那里的评论部分。

ReadIntervalTimeout成员设置为MAXDWORD并且成员ReadTotalTimeoutConstantReadTotalTimeoutMultiplier设置为零时,可能会出现此症状,因为此特定值组合允许{{1即使没有收到任何字节,也要立即重新启动。