在批处理命令调用的Qt程序中无法打开端口

时间:2016-06-16 08:56:10

标签: c++ windows batch-file port qt5

我有两个程序从批处理文件顺序运行。第一个是我自己编写的程序,它将通过串行连接更新具有该板的最新软件版本的电路板。第二个是我已更新到Qt5的旧程序,它将通过同一串行连接发送一系列由xml文件指定的命令。

第一个程序成功执行,但第二个程序无法打开端口上的通信。我已经尝试设置程序重试打开端口失败,以确保它不仅仅是一个时间问题,但即使离开运行8小时(我忘了我有一个夜间构建设置)它仍然没有成功连接的。

我已经尝试按顺序多次运行第一个程序,并且它每次都设法打开端口,因此,我不相信它在执行完成时无法关闭端口。当我将应用程序更新到Qt5时,我没有改变的一件事是串口连接。由于它是为没有QSerialPort的Qt版本编写的,因此它使用Windows SerialAccess进行串行连接。我没有改变这个,因为我不熟悉该库,并且不想对程序的其余部分造成任何影响,但是,如果有必要,我可以将其更改为QSerialPort。

在此之前,虽然我想确保这是问题,但调用configurePort函数的代码是:

bool SerialSession::openPort(const QString portName, quint32 baud)
  {
  if (connected) return false; // can't have two connections

  if (SerialAccess::configurePort(QString(portName).prepend("\\\\.\\"), baud))
  {
  m_baud = baud;
  m_port = QString(portName).prepend("\\\\.\\");
  connected = true;

  // start the data collection 'thread'
  m_timer.setInterval(100);
  connect(&m_timer, SIGNAL(timeout()), this, SLOT(readNewData())
  , Qt::QueuedConnection);
  m_timer.setSingleShot(false);
  m_timer.start();
  return true;
  }
  else return false;
  }

我可以根据需要提供更多代码。有谁知道可能导致这种情况的原因?

bool SerialAccess::configurePort(QString port, quint32 baud)
{
    // Close if already open;
    if( m_PortHandles.contains(port))
        return true;

    DCB dcb;
    COMMCONFIG CC;
    DWORD dwSize;
    HANDLE hndl;
    COMMTIMEOUTS timeout;


    hndl = CreateFile(port.toStdWString().c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(!GetCommState(hndl, &dcb))
        return false;


    //
   // Configure it
  //

    // Set settings.
    dcb.BaudRate = baud;
    dcb.ByteSize = DATA_BITS;
    dcb.Parity = PARITY;
    dcb.StopBits = STOP_BITS;


    // Get then set config.
    GetCommConfig(hndl, &CC, &dwSize);
    CC.dcb = dcb;
    SetCommConfig(hndl, &CC, dwSize);

    GetCommTimeouts(hndl, &timeout);

     // returns this many milliseconds *after*
     // receiving a character, unless another
     // character is received.
     // Doesn't apply for the first character.
    timeout.ReadIntervalTimeout = 1;
     // Total timeout is the timeout constant(ms)...
    timeout.ReadTotalTimeoutConstant = 100;
     // ...plus the timeout multiplier(ms)
     // multiplied by the max number of characters to read.
    timeout.ReadTotalTimeoutMultiplier = 0;

     // Same for write, but without the interval
    timeout.WriteTotalTimeoutConstant = 10;
    timeout.WriteTotalTimeoutMultiplier = 1;

    SetCommTimeouts(hndl, &timeout);

    if(!hndl)
        return false;

    m_PortHandles.insert(port, hndl);
    return true;
}

批处理文件的代码:

cd Update\CA20-2401*
move "Binary\CA20-2401*.pkg" ..\package.pkg
cd ..\..\
mkdir publish
cd Update
EmbeddedBoardTestScriptUtility.exe COM4 IO package.pkg CA20-2401 0 COM3 1

cd ..\
7z x "CA20-0141*/Binary/CA20-0141*.zip" -aoa -o"Test"
move "IO Expansion Board\*.xml" "Test"
cd Test
Protocol_Test_Utility.exe -s Get_Version_IOEB.xml IOEB_tests basic_tests get_boot_status 

1 个答案:

答案 0 :(得分:0)

我更新了程序,使用QSerialPort代替winsock的东西,它现在有效,我不知道确切的问题是什么,但这解决了它。