• 1803阅读
  • 5回复

[提问]关于Qt串口通信发送指令问题 [复制链接]

上一主题 下一主题
离线半根鸡爪
 

只看楼主 倒序阅读 楼主  发表于: 2015-04-15
回复本帖可获得50RMB金钱奖励!
每人最多可获奖1次,奖池剩余100RMB金钱 (中奖几率10%)
— 本帖被 XChinux 从 其它技术开发讨论区 移动到本区(2015-07-28) —
想做一个上位机,实现功能为:不断给MODBUS的电压(流)表发查询指令,实时监控表值。  
目前已经实现基本通讯,能查询表值了。
问题:使用QTimer每隔1S询问一次表值,就会出现错误。如图:

网上没有找到相关错误,错误的意思是不是QByteArray溢出了呢?
部分代码如下:
//串口配置
void Charge::SerialPortInit()
{
    MySerialPort = new QSerialPort;
    //串口配置
    QString PortNameStr;
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() << "Name:" <<info.portName();
        PortNameStr = info.portName();
    }
    MySerialPort->setPortName(PortNameStr);
    MySerialPort->open(QIODevice::ReadWrite);
    MySerialPort->setBaudRate(9600);
    MySerialPort->setDataBits(QSerialPort::Data8);
    MySerialPort->setParity(QSerialPort::NoParity);
    MySerialPort->setStopBits(QSerialPort::OneStop);
    //每隔1s发送一次查询指令
    timer1 = new QTimer(this);
    connect(timer1,SIGNAL(timeout()), this,SLOT(Send()));
    timer1->start(1000);
    Send();
}

//发送函数
void Charge::Send()
{
    //指令配置
    QString SendStr;
    SendStr.append(QChar(0x01));
    SendStr.append(QChar(0x04));
    SendStr.append(QChar(0x00));
    SendStr.append(QChar(0x00));
    SendStr.append(QChar(0x00));
    SendStr.append(QChar(0x01));
    SendStr.append(QChar(0x31));
    SendStr.append(QChar(0xCA));

    MySerialPort->write(SendStr.toLatin1());
    connect(MySerialPort,SIGNAL(readyRead()), this,SLOT(Rece()));
}

//接收函数
void Charge::Rece()
{
    unsigned char VmDataH;
    unsigned char VmDataL;
    float VmData;
    ReceData = MySerialPort->readAll();
    VmDataH = ReceData.at(3);
    VmDataL = ReceData.at(4);
    VmData = float(VmDataH*256+VmDataL)/10;
    QString VmDataStr = QString("%1").arg(VmData);
    if(!ReceData.isEmpty())
    {
        ui->VmLEdit_1->setText(VmDataStr);
    }
    ReceData.clear();
}

本人初学,谢谢各位大大指点,分也没有多少,真是不好意思。谢过各位大神!!!
离线半根鸡爪

只看该作者 1楼 发表于: 2015-04-16
自己顶一下,为什么没人回复呢。
本人新手,没怎么发过帖子,是我发的帖子有啥问题还是发错地方吗
离线hisixunil

只看该作者 2楼 发表于: 2015-04-17
我是来领奖金的
离线kyle_2535

只看该作者 3楼 发表于: 01-10
不懂,支持。
离线cluckly

只看该作者 4楼 发表于: 01-10
问题应该在这几行:
    ReceData = MySerialPort->readAll();
    VmDataH = ReceData.at(3);
    VmDataL = ReceData.at(4);

读回数据后没有检查数据长度, 很有可能读回的数据长度只有3个字符, 那么读位置3和4就超出了bytearray的范围, 导致了assert触发.
离线judesmorning

只看该作者 5楼 发表于: 01-13
看到: connect(timer1,SIGNAL(timeout()), this,SLOT(Send()));
就看不下去了,每一秒做一次Send函数,然后你在这里connect信号与槽,是什么意思?
你不知道信号与槽会重复绑定的吗
快速回复
限100 字节
 
上一个 下一个