Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Qt的串口扩展行为_C++_Qt_Serial Port_Microcontroller_Qtserialport - Fatal编程技术网

C++ 使用Qt的串口扩展行为

C++ 使用Qt的串口扩展行为,c++,qt,serial-port,microcontroller,qtserialport,C++,Qt,Serial Port,Microcontroller,Qtserialport,我正在使用QT执行一个应用程序,通过rs-232将我的PC与8位微控制器进行通信。我正在使用QtSerialPort库,通信正常,但每次我从PC向micro写入内容并收到响应时,我必须关闭并打开串行端口,否则我无法继续通信。。我的配置是:10500bps,8位,1站,无奇偶校验,无流量控制 用于端口配置和讲授/编写的代码如下: bool DriverS::configure(int port, int baudRate) { if(port!=22) return fal

我正在使用QT执行一个应用程序,通过rs-232将我的PC与8位微控制器进行通信。我正在使用QtSerialPort库,通信正常,但每次我从PC向micro写入内容并收到响应时,我必须关闭并打开串行端口,否则我无法继续通信。。我的配置是:10500bps,8位,1站,无奇偶校验,无流量控制

用于端口配置和讲授/编写的代码如下:

bool DriverS::configure(int port, int baudRate)
{
    if(port!=22)
        return false;

     serialPort->setPortName("COM22");

 if (serialPort->open(QIODevice::ReadWrite)==true){

        if (!serialPort->setBaudRate(baudRate)) {
            return false ;
        }

        if (!serialPort->setDataBits(QSerialPort::Data8)) {
            return false ;
        }

        if (!serialPort->setParity(QSerialPort::NoParity)) {
            return false;
        }

        if (!serialPort->setStopBits(QSerialPort::OneStop)) {
            return false;
        }

        if (!serialPort->setFlowControl(QSerialPort::NoFlowControl)){
            return false;
            }
    };

    return true;
}



bool DriverS::read(QByteArray & rxData, int * size)
{

    Sleep(200); 
    *size = 0;
    if (serialPort->waitForReadyRead(TIMEOUT_SERIAL)) {
        rxData = serialPort->readAll();
        *size = rxData.size() ;

    if (!this->checkCRC(rxData))
        {
            qDebug()<< "Rx Checksum Error";
            return false;
        }

    return true;
    }
    qDebug()<< "Rx Timeout";
    return false;
}

bool DriverS::write(QByteArray txData)
{

    unsigned int chk = 0;
    int ret ;

    for(int i = 0;i<txData.size();i++)
    {
        chk+=txData.at(i);
    }

    txData.append(chk);
    ret = serialPort->write(txData);
    return (txData.size()==ret);

}
bool驱动程序::配置(int端口,int波特率)
{
如果(端口!=22)
返回false;
serialPort->setPortName(“COM22”);
如果(串行端口->打开(QIODevice::ReadWrite)==true){
如果(!serialPort->setBaudRate(波特率)){
返回false;
}
如果(!serialPort->setDataBits(QSerialPort::Data8)){
返回false;
}
如果(!serialPort->setParity(QSerialPort::NoParity)){
返回false;
}
如果(!serialPort->setStopBits(QSerialPort::OneStop)){
返回false;
}
如果(!serialPort->setFlowControl(QSerialPort::NoFlowControl)){
返回false;
}
};
返回true;
}
bool驱动程序::读取(QByteArray和rxData,int*size)
{
睡眠(200);
*尺寸=0;
如果(串行端口->waitForReadyRead(超时\串行)){
rxData=serialPort->readAll();
*size=rxData.size();
如果(!this->checkCRC(rxData))
{

qDebug()我发现自己的情况与此完全相同。我陷入了读取例程。请尝试以无缓冲模式打开端口

端口->打开(QIODevice::ReadWrite | QIODevice::无缓冲)

这是我在一台电脑上发现的,我以前从未做过,但它可能会让你摆脱困境。

我解决了我的两个问题(尽管我不确定方法)

对于问题num 1(每次需要通信时打开和关闭端口),我只是在我的write方法中添加了一个waitFobytesWrite()


对于我的问题编号2(我只能使用port22),我修改了配置,现在我首先检测AvailableReports()中有哪些端口可用改为强制使用我想要使用的端口。现在我可以将我的设备连接到任何可用端口,并且可以正常工作。

请发布您如何设置和打开端口的代码。您可以显示带有此问题的代码吗?您是否检查了错误字符串?它说了什么?无法根据n不幸的是,这条信息。另外,你只是在使用dsub-9串行端口,还是涉及到一些usb串行加密狗?你的电脑上运行的是什么操作系统?你使用的是哪个Qt版本?哪个QtSerialPort版本?是32位还是64位?它只与8位微控制器一起工作吗?它是什么微控制器?克里斯蒂娜,你知道吗解决问题了吗?您好,很抱歉我的回复太晚,我最近几天一直很忙。回答:-错误字符串表示:“正在运行的操作系统不支持或禁止请求的设备操作”。-操作系统:Windows 8.1 64位-8位微控制器(我使用的唯一一个):mc9S08AW60-我的QT版本:4.8.1-我使用的不是dsub9连接器,而是Usb到TTL-232转换器(FTDI)Cristina,以防万一,如果W8上存在这样的问题,您是否尝试以管理员身份运行应用程序?另一个有趣的问题是,我只能使用COM22,其余端口未被检测到:-请编辑此答案以仅回答此问题。然后就新问题问一个新问题。这就是问题的含义一个是严格的QA格式,不像一些论坛或在线聊天。