COM端口读取期间C ++程序冻结

时间:2014-07-31 22:54:52

标签: c++ serial-port

我正在尝试编写一个简单的程序,通过COM端口将单个字符发送到程序,并阅读我得到的答案。我想我有工作脚本,我至少可以通过com端口发送命令,但是当ReadFile函数开始时它会冻结。我将通讯超时设置为100毫秒,所以我不认为它正在锁定端口,但我可能错了。我没有收到任何错误,编译时没有任何警告。我是C ++的新手(通常使用python),所以请尽可能清楚地了解你的答案。

// comtest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>


int main(int argc, char **argv)
{
    std::cout << "TOP! \n";
    char buffer[1];
    HANDLE file;
    COMMTIMEOUTS timeouts;
    DWORD read, written;
    DCB port;
    char init[] = ""; // e.g., "ATZ" to completely reset a modem.

    // open the comm port.
    file = CreateFile(L"COM1",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

    std::cout << "file made \n";
    // get the current DCB, and adjust a few bits to our liking.
    memset(&port, 0, sizeof(port));
    port.DCBlength = sizeof(port);

    // set short timeouts on the comm port.
    timeouts.ReadIntervalTimeout = 100;
    timeouts.ReadTotalTimeoutMultiplier = 1;
    timeouts.ReadTotalTimeoutConstant = 100;
    timeouts.WriteTotalTimeoutMultiplier = 1;
    timeouts.WriteTotalTimeoutConstant = 100;

    int N = 10;
    while (N > 1) 
    {

        std::cout << "i'm in the loop!" << N << " loops left \n";
        char command [1];
        char * commandbuff;
        std::cin >> command;
        commandbuff = &command[1];
        WriteFile(file, commandbuff, sizeof(commandbuff),&written, NULL);
        Sleep(1000);
        std::cout << "I just slept \n";
        ReadFile(file, buffer, sizeof(buffer), &read, NULL);
        N--;
    }
    // close up and go home.
    CloseHandle(file);
    return 0;

2 个答案:

答案 0 :(得分:2)

您的代码似乎没有实际调用SetCommTimeouts,因此您定义的超时无法应用。

答案 1 :(得分:0)

从com接收数据,除非先发送命令或得到响应的内容,否则不要开始读取。然后,最好一次只读取一个字节,但是如果像我一样发送modbus/at commands,并且知道您期望返回8个字节,那么可以使用readfile读取8个字节。在读取该单个字节之前,大多数C ++ com端口示例都具有SetCommState,SetCommTimeouts,SetCommMask和WaitCommEvent。

我的ReadFile的第二个参数上带有“&”。 MS Visual C ++虽然。 状态= ReadFile(fileusb,&ReadData,sizeof(ReadData),&NoBytesRead,NULL);