1

我正在尝试在 Qt 中创建一个应用程序来配置蓝牙模块 RN42 http://ww1.microchip.com/downloads/en/DeviceDoc/rn-42-ds-v2.32r.pdf。为了配置模块,必须通过串行端口发送一些命令,但这是异常事情开始发生的地方。我通过 xbee xplorer 将它连接到计算机,我可以使用我的应用程序毫无问题地对其进行配置,但是当我尝试检索当前配置时没有得到响应,我可以看到设备进入配置模式,因为 LED 闪烁得更快,但我无法通过串口从设备获得任何反馈。

因此,我决定开始使用 arduino 进行调试,如果我通过编程端口连接它,我可以毫无问题地进行通信,但如果我将它与 USB 本机端口连接,我不会从设备获得任何信息。但是,如果我用 arduino 串行监视器打开端口,通信就会开始,然后关闭 arduino 串行监视器,打开我的应用程序,我就可以毫无问题地进行通信了。

我也尝试与docklight(串行监视器应用程序)通信,并且再次通信没有问题,但是如果在与docklight通信后我尝试与我的应用程序通信,则不会得到响应,这与arduino串行监视器不同。

尽管我使用示波器进行了调试,但我可以看到信息是在端口关闭后发送的。

我尝试了很多不同的事情,但我不知道我做错了什么。我认为它与端口的配置有关,但不确定,这可能是 QtSerialport 的错误吗?

这是我的程序。我在带有 MinGW53_32 的 Windows 中使用 Qt creator 5.9.1

QT

.pro

#-------------------------------------------------
#
# Project created by QtCreator 2017-07-25T08:39:59
#
#-------------------------------------------------

QT       += core gui
QT       += serialport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = BT_Config_Tool
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        bluetooth_config.cpp

HEADERS += \
        bluetooth_config.h

FORMS += \
        bluetooth_config.ui

蓝牙配置.h

#ifndef BLUETOOTH_CONFIG_H
#define BLUETOOTH_CONFIG_H

#include <QMainWindow>
#include <QTimer>
#include <QSerialPort>
#include <QtSerialPort>
#include <QtSerialPort/QtSerialPort>
#include <stdio.h>
#include <math.h>
#include <QSerialPortInfo>

#define BUFFMAX 1000

namespace Ui {
class bluetooth_config;
}

class bluetooth_config : public QMainWindow
{
    Q_OBJECT
public slots:
    void ReadDevice(void);
    void FlashDevice(void);
    void UpdateCombobox(void);
    void ReadSerial(void);

public:
    explicit bluetooth_config(QWidget *parent = 0);
    ~bluetooth_config();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::bluetooth_config *ui;
    QSerialPort *_port;
    QTimer *_timerRead;
    QTimer *_timerFlash;
    QTimer *_timerUpdateCombobox;
    QSerialPortInfo *_serialPortInfo;
    int _cFlash = 0;
    int _cRead = 0;
    char _buffer[BUFFMAX];
    //QByteArray _buffer;
    int c;
};

#endif // BLUETOOTH_CONFIG_H

bluetooth_config.cpp

#include "bluetooth_config.h"
#include "ui_bluetooth_config.h"

const char *nameFlash;
const char *passFlash;
const char *nameRead;
char trama[BUFFMAX];
int item = 0;


bluetooth_config::bluetooth_config(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::bluetooth_config)
{
    ui->setupUi(this);
    ui->label_4->setVisible(false);
    ui->label_5->setVisible(false);

    _timerRead = new QTimer(this);
    connect(_timerRead,SIGNAL(timeout()),this, SLOT(ReadDevice()));

    _timerFlash = new QTimer(this);
    connect(_timerFlash,SIGNAL(timeout()),this, SLOT(FlashDevice()));

    _timerUpdateCombobox = new QTimer(this);
    connect(_timerUpdateCombobox,SIGNAL(timeout()),this, SLOT(UpdateCombobox()));
    _timerUpdateCombobox->start(2000);

    _port = new QSerialPort();
    _port->setBaudRate(QSerialPort::Baud115200);
    _port->setDataBits(QSerialPort::Data8);
    _port->setParity(QSerialPort::NoParity);
    _port->setStopBits(QSerialPort::OneStop);
    _port->setFlowControl(QSerialPort::NoFlowControl);
    connect(_port,SIGNAL(readyRead()),this,SLOT(ReadSerial()));

    //ui->tabWidget->setTabEnabled(0, false);

}

bluetooth_config::~bluetooth_config()
{
    delete ui;
}

void bluetooth_config::ReadDevice()
{
    _cRead ++;
    if (_cRead == 1){
        _port->write("$$$");
        ui->lcdNumber_2->display(_cRead);
        _timerRead->stop();
    }
    else if (_cRead == 2){
        _port->write("---\r\n");
        _port->waitForBytesWritten();
        ui->lcdNumber_2->display(_cRead);
        _timerRead->stop();
    }
    else if (_cRead == 3){
        ui->label_5->setVisible(true);
        ui->lcdNumber_2->display(_cRead);
        _timerRead->stop();
        _cRead = 0;
    }
}

void bluetooth_config::FlashDevice()
{
    _cFlash ++;
    if (_cFlash == 1){
        _port->write("$$$");
    }
    else if (_cFlash == 2){
            nameFlash = ui->lineEdit->displayText().toUtf8().constData();
            strcpy(trama, "SN,");
            strcat(trama,nameFlash);
            strcat(trama,"\n\r");
            _port->write(trama);
    }
    else if (_cFlash == 3){
        passFlash = ui->lineEdit_2->displayText().toUtf8().constData();
        strcpy(trama, "SP,");
        strcat(trama,passFlash);
        strcat(trama,"\n\r");
        _port->write(trama);
    }
    else if (_cFlash == 4){
        _port->write("---\n\r");
    }
    else if (_cFlash == 5){
        _cFlash = 0;
        _timerFlash->stop();
        ui->label_4->setVisible(true);
    }
}

void bluetooth_config::UpdateCombobox()
{
    item = ui->comboBox->currentIndex();
    ui->comboBox->clear();

    foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
    {
        ui->comboBox->addItem(serialPortInfo.portName());
    }

    if (item <= (ui->comboBox->count() - 1) && item >= 0){
        ui->comboBox->setCurrentIndex(item);
    }
    else {
        ui->comboBox->setCurrentIndex(ui->comboBox->count() - 1);
    }
}

void bluetooth_config::ReadSerial()
{
    int ojete = _port->bytesAvailable();
    ui->lcdNumber->display(ojete);
    //_port->read(_buffer,BUFFMAX);
    QByteArray a = _port->readAll();
    //ui->plainTextEdit->appendPlainText(_buffer);
    ui->plainTextEdit->appendPlainText(a);
    if (_cRead == 1 || _cRead == 2){
        _timerRead->start(50);
    }
}

void bluetooth_config::on_pushButton_clicked()
{
    ui->label_5->setVisible(false);
    _timerRead->start(50);
    _port->flush();
}

void bluetooth_config::on_pushButton_2_clicked()
{
    ui->label_4->setVisible(false);
    _timerFlash->start(50);
    _port->flush();
}

void bluetooth_config::on_pushButton_3_clicked()
{
    if (!_port->isOpen()){
        _port->setPortName(ui->comboBox->currentText());
        if (_port->open(QIODevice::ReadWrite)){
                ui->label_3->setText("Puerto abierto");
                ui->pushButton_3->setText("Cerrar");
                ui->pushButton->setEnabled(true);
                ui->pushButton_2->setEnabled(true);
        }
        else {
            ui->label_3->setText("Ha ocurrido un error al abrir el puerto");
        }
    }
    else {
        _port->close();
        ui->label_3->setText("Puerto cerrado");
        ui->pushButton_3->setText("Abrir");
        ui->pushButton->setEnabled(false);
        ui->pushButton_2->setEnabled(false);
    }
}

主文件

#include "bluetooth_config.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    bluetooth_config w;
    w.show();

    return a.exec();
}

非常感谢。

亚历杭德罗

4

0 回答 0