我有两个程序从批处理文件顺序运行。第一个是我自己编写的程序,它将通过串行连接更新具有该板的最新软件版本的电路板。第二个是我已更新到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
答案 0 :(得分:0)
我更新了程序,使用QSerialPort代替winsock的东西,它现在有效,我不知道确切的问题是什么,但这解决了它。