Asistente de depuración serial de combate real del proyecto QT

Tabla de contenido

I. Introducción

1. Lectura ampliada sobre la codificación de juegos de caracteres

2. Un resumen sobre la codificación de caracteres

2. Función y efecto

1. Efecto

2. Función

Tres, el proceso de realización

1. Cree la ventana QMainWindow y el diseño de la interfaz de usuario

2. Implementación del código

1. Cómo asociar señales y ranuras

2. Envío y guardado de archivos

3. Guarde la información de configuración

4. Conversión entre caracteres y caracteres codificados hexadecimales

3. Lanzamiento del paquete del proyecto

1. Utilice el propio windeployqt.exe de QT para empaquetar

2. Utilice el editor HM NIS Edit y el compilador NSIS para un empaquetado más profundo

Cuatro, prueba funcional


I. Introducción

Aquí hay un pequeño software asistente de depuración en serie escrito por Amway. Está escrito en QT5.5 . Se puede usar normalmente en Windows. No se ha probado en el entorno Linux. Pueden aparecer caracteres ilegibles porque la codificación de caracteres en el entorno Windows es ANSI (en ANSI en el sistema chino es codificación GBK), y la codificación de caracteres en el entorno Linux es UTF-8, y los datos enviados y recibidos en el asistente de depuración también se convierten de acuerdo con la codificación GBK. como:

personaje

Codificación GBK

Codificación Unicode

UTF-8

"123 Aprendizaje"

31 32 33 D1 A7 CF B0

31 32 33 5B 66 4E 60

31 32 33 E5 AD A6 E4 B9 A0

1. Lectura ampliada sobre la codificación de juegos de caracteres

1. Consulta de codificación de juego de caracteres chinos

2. Verifique la codificación de caracteres (UTF-8)

3. Convierte entre unicode y utf-8

4. ¿Qué es el código ANSI?

5. QT puerto serie problema de visualización chino, Unicode para GBK

6. Codificación de caracteres QT

2. Un resumen sobre la codificación de caracteres

1. Los caracteres son un montón de símbolos de texto. Cada país tiene su propio idioma y caracteres. ¿Cómo se almacenan estos caracteres en la computadora? Todas las computadoras se almacenan en 01 binario, así que convierta estos caracteres en sus códigos binarios únicos y correspondientes. También hay varias codificaciones, como ASCII en inglés, codificación GDB en chino, codificación Shift-JIS en japonés, etc.

2. Código ASCII : En la década de 1960, Estados Unidos formuló un conjunto de códigos de caracteres para regular uniformemente la relación entre caracteres ingleses y bits binarios. Esto se llama código ASCII. El código ASCII especifica 128 caracteres en total. Codificación. Solo ocupa los últimos 7 bits de un byte, y el primer bit se define uniformemente como 0

3. Código GBK : la codificación en inglés con 128 símbolos es suficiente, pero para otros idiomas, 128 símbolos no son suficientes, por lo que se utilizan dos bytes para representar un carácter chino, por lo que, en teoría, puede representar hasta 256x256 = 65536 símbolo

4. Unicode : Hay muchos métodos de codificación en el mundo. El mismo número binario se puede interpretar como símbolos diferentes. Si desea abrir un archivo de texto, debe conocer su método de codificación, de lo contrario será interpretado por el método de codificación incorrecto. Aparecen caracteres ilegibles. Para solucionar el problema de la inconsistencia, una organización internacional salió a formular una codificación que incluye todos los caracteres del idioma del mundo, esta es la codificación Unicode. Unicode generalmente usa dos bytes para representar un carácter. La codificación original en inglés cambia de un byte a un byte doble. Solo necesita completar todos los bytes altos con 0. Pero Unicode es solo un conjunto de símbolos, solo especifica el código binario del símbolo, pero no especifica cómo se debe almacenar el código binario. Si se usa Unicode para representar la ventaja de 1 byte de ASCII, desperdicia memoria, y también hay diferentes métodos de almacenamiento de Unicode.

5. Codificación UTF-8 : UTF-8 es la implementación de Unicode más utilizada en Internet. Otras implementaciones incluyen UTF-16 y UTF-32. Una de las características más importantes de UTF-8 es que es un método de codificación de longitud variable, puede usar de 1 a 6 bytes para representar un símbolo y la longitud de los bytes varía según los diferentes símbolos.

2. Función y efecto

1. Efecto

No digas tonterías, mira el efecto primero

2. Función

1. Registre y guarde la información de configuración del puerto serie, para que pueda usar directamente la última configuración cuando lo abra la próxima vez

2. Guarde los datos en el área de recepción del puerto serie (se puede recibir por el puerto serie o enviar por el puerto serie)

3. Una tecla para borrar los datos en la ventana de recepción y la ventana de envío

4. Al recibir, puede elegir visualización hexadecimal o visualización de caracteres, puede elegir mostrar la hora actual y los datos enviados

5. Al enviar, puede elegir enviar con regularidad, enviar una nueva línea y enviar datos de archivo. Cabe señalar que seleccionar o no seleccionar la transmisión hexadecimal es solo el cambio de la visualización de caracteres en el área de transmisión. Los datos enviados son todos datos de bytes codificados en ANSI; cuando se selecciona hexadecimal, los caracteres se convertirán a codificación ANSI (aquí es Código GBK), muestra caracteres sin verificar hexadecimal o convierte datos hexadecimales en caracteres de acuerdo con el código ANSI

6. Puede mostrar el estado actual del puerto serie, el número de bytes enviados, el número de bytes recibidos y la hora actual.

Tres, el proceso de realización

1. Cree la ventana QMainWindow y el diseño de la interfaz de usuario

Después de la creación, agregue QT + = serialport en el archivo de administración del proyecto .pro para que se pueda usar el puerto serial

2. Implementación del código

Conexión de origen: https://github.com/denghengli/qt_study/tree/master/17_SerialPort

Concentrarse en:

1. Cómo asociar señales y ranuras

método uno:

0) Si es una señal personalizada, debe declararse en .h

1) Declare la función de ranura en .h

2) Implementar la función de ranura en .cpp

3) Use connect para conectar la señal y la función de ranura:

QObject::connect(ui->pushbutton,SIGNAL( clicked() ),this,SLOT( on_pushBuuton_clicked() );

Método dos:

En el archivo .ui, haga clic con el botón derecho en el botón, seleccione la opción "ir a la ranura", seleccione la señal "hizo clic" y el botón Aceptar independiente. El sistema genera automáticamente la declaración y la definición de la función de ranura y establece el mapeo interno. Simplemente escriba la función de la función de ranura en el cuerpo de la función de ranura y agregue la declaración como paso 2 en el método 1.

Método tres:

En la interfaz .ui, seleccione la opción "cambiar señal / ranura", haga clic en "+" para agregar una nueva función de ranura, confirme para completar la adición de la función de ranura y, finalmente, repita los pasos 1 y 2 del Método 1 para completar la declaración y definición de la función de ranura.

2. Envío y guardado de archivos

A través del cuadro de diálogo de archivo proporcionado por la clase QFileDialog, para seleccionar el archivo a enviar y el archivo recién guardado

openfile_path = QFileDialog::getOpenFileName(this, "打开文件", "", "Text File(*.txt)"); 
savefile_path = QFileDialog::getSaveFileName(this,"另存为", savefile_path, "Text File(*.txt)");

3. Guarde la información de configuración

Cada vez después de configurar el puerto serie, la velocidad en baudios, el bit de parada, etc., al abrir el puerto serie, guarde la información de configuración en forma de valor clave en un archivo predeterminado a través de la clase QSettings; también léalo primero cada vez que se abre el software Obtenga los datos de este archivo de configuración y luego configure el puerto serie

//创建ini配置文件
void SerialPort::configiniInit()
{
    iniPath = new QDir;
    iniFilename = iniPath->currentPath() + "/SerialPort.ini";
    //构造一个QSettings对象,用于访问存储在名为iniFilename的文件中的设置。如果文件不存在,就创建它
    configini = new QSettings(iniFilename, QSettings::IniFormat);
}

//读取ini配置文件,设置下拉框的项目
void SerialPort::configiniRead()
{
    configini->beginGroup("SETUP");
    int i_port = configini->value("COM").toInt();
    int i_baudrate = configini->value("baudrate").toInt();
    int i_databit = configini->value("databit").toInt();
    int i_checkbit = configini->value("checkbit").toInt();
    int i_stopbit = configini->value("stopbit").toInt();
    configini->endGroup();

    ui->CB_port->setCurrentIndex(i_port);
    ui->CB_baudrate->setCurrentIndex(i_baudrate);
    ui->CB_databit->setCurrentIndex(i_databit);
    ui->CB_checkbit->setCurrentIndex(i_checkbit);
    ui->CB_stopbit->setCurrentIndex(i_stopbit);
}

//写ini配置文件,将下拉框的项目索引写入ini文件
void SerialPort::configiniWrite()
{
    configini->beginGroup("SETUP");
    configini->setValue("COM", ui->CB_port->currentIndex());
    configini->setValue("baudrate", ui->CB_baudrate->currentIndex());
    configini->setValue("databit", ui->CB_databit->currentIndex());
    configini->setValue("checkbit", ui->CB_checkbit->currentIndex());
    configini->setValue("stopbit", ui->CB_stopbit->currentIndex());
    configini->endGroup();
}

4. Conversión entre caracteres y caracteres codificados hexadecimales

No lo confunda, es la conversión entre caracteres y caracteres de código hexadecimal ANSI (aquí GBK) ;

Por ejemplo: "123 Learning" <----> "31 32 33 D1 A7 CF B0"

La razón es que el control textEdit muestra caracteres QString y necesita cambiar entre caracteres y hexadecimal cuando se muestra.

"123 Aprendizaje" ----> "31 32 33 D1 A7 CF B0" Pasos:

//1、获取发送数据 QString = "123学习"
QString sendstr = ui->textEdit_tx->toPlainText();

//2、"123学习" --> GBK编码:31 32 33 D1 A7 CF B0
QByteArray sendarray = sendstr.toLocal8Bit();//"123学习"在QT中是UTF8编码的,所以这里需要使用toLocal8Bit转成Winds中的GBK编码
//3、GBK编码:31 32 33 D1 A7 CF B0 --> GBK编码字符:"31 32 33 D1 A7 CF B0"
QDataStream out(&sendarray,QIODevice::ReadWrite);    //将字节数组读入
while(!out.atEnd())
{
    qint8 outChar = 0;
    out>>outChar;   //每字节填充一次,直到结束
    QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));
    str = str.toUpper();
    ui->textEdit_tx->insertPlainText(str + " ");//在当前光标处插入文本
    //返回表示当前可见游标的QTextCursor副本。对返回游标的更改不会影响QTextEdit的游标;使用setTextCursor()更新可见的游标
    QTextCursor cursor = ui->textEdit_tx->textCursor();
    cursor.movePosition(QTextCursor::End);//将光标移动到文档的最后
    ui->textEdit_tx->setTextCursor(cursor);//更新光标
}

"31 32 33 D1 A7 CF B0" ----> "123 Aprendizaje" Pasos:

//1、获取发送数据 QString = "31 32 33 D1 A7 CF B0"
QString sendstr = ui->textEdit_tx->toPlainText();
QByteArray sendarray;
//2、GBK编码字符:"31 32 33 D1 A7 CF B0" --> GBK编码:31 32 33 D1 A7 CF B0
QStringtoHex(sendarray, sendstr);
//3、GBK编码:31 32 33 D1 A7 CF B0 --> Unicode编码 --> "123学习"
QString str1 = QString::fromLocal8Bit(sendarray);//实现了从本地字符集GBK到Unicode的转换,解决中文显示乱码问题
ui->textEdit_tx->setText(str1);

Puede ver que la función QStringtoHex (QByteArray & sendData, QString str) es más crítica , pero también es relativamente simple de implementar

char SerialPort::ConvertHexChar(char c)
{
    if(c>='a'&&c<='f'){
        return c-'a'+10;
    }
    else if(c>='A'&&c<='F'){
        return c-'A'+10;
    }
    else if(c>='0'&&c<='9'){
        return c-'0';
    }
    else{
        return -1;
    }
}
//"31 32 33 D1 A7 CF B0" --> 31 32 33 D1 A7 CF B0
void SerialPort::QStringtoHex(QByteArray& sendData,QString str)
{
    char hstr,lstr,hdata,ldata;
    int len = str.length();
    int sendnum = 0;
    QByteArray temp;
    temp.resize(len/2);//设置大小,len/2会大于实际16进制字符
    
    for(int i=0;i<len;)
    {
        //QString转QByteArray的方法,Latin1代表ASCII。'3' --> 3
        hstr = str[i].toLatin1();
        if(hstr == ' '){
            ++i; continue;
        }
        if(++i >= len) break;
        lstr = str[i].toLatin1();

        hdata = ConvertHexChar(hstr);
        ldata = ConvertHexChar(lstr);
        if(-1 == hdata || -1 == ldata)
            break;
        ++i;
        temp[sendnum] = hdata<<4|ldata;
        sendnum++;
    }
    sendData.reserve(sendnum);//重新调整大小
    sendData = temp.left(sendnum);//返回一个 字节数组,其中包含这个字节数组最左边的len字节。去掉多余字符
}

3. Lanzamiento del paquete del proyecto

1. Utilice el propio windeployqt.exe de QT para empaquetar

1. Seleccione la versión y cree el proyecto.

2. Copie el archivo .exe en cualquier ruta y empaquételo para que pueda ejecutarse en cualquier computadora que no tenga el entorno QT instalado Antes de empaquetar, primero asegúrese de que haya windeployqt.exe en el directorio de instalación de QT.

3. Abra la terminal e ingrese el directorio .exe (acceso directo: en la carpeta, haga clic en el espacio en blanco, shift + clic derecho y seleccione "abrir ventana aquí"), e ingrese el archivo windeployqt.exe

4. Una vez que la generación sea exitosa, se generarán algunos archivos en el directorio actual. Copie esta carpeta en cualquier computadora sin un entorno QT para ejecutar

2. Utilice el editor HM NIS Edit y el compilador NSIS para un empaquetado más profundo

1. Primero use windeployqt.exe propio de QT para empaquetar y generar archivos ejecutables y bibliotecas dinámicas requeridas

2. Descargue e instale los dos software NSIS y NIS Edit

3. De acuerdo con los pasos para usar el asistente de instalación de NIS Edit , empaquete el archivo empaquetado de windeployqt.exe para generar un archivo de asistente de instalación de Setup.exe; cuando use NIS EDIT para instalar, hay un punto que necesita atención, al seleccionar el archivo de la aplicación Cuándo, elija la carpeta que necesita empaquetar

Una vez finalizado, puede instalar y utilizar el asistente de depuración en serie a través de este Setup.exe . Cuando instale Setup.exe , siga las instrucciones y el siguiente paso está bien . ¿Está mejorado así? Jaja

Cuatro, prueba funcional

1. Descargue una herramienta de puerto serie virtual. Descargué VSDP . Por supuesto, otros están bien. Siempre que el puerto serie se pueda virtualizar localmente, como se muestra en la figura siguiente, COM1 y COM2 se pueden interconectar; "Agregar par" agrega un nuevo puerto serie virtual

2. Abra COM2 con puerto serie y use un asistente de depuración serie (aquí XCOM) para abrir COM1. Está bien probar el envío de datos entre sí

 

Supongo que te gusta

Origin blog.csdn.net/m0_37845735/article/details/108655012
Recomendado
Clasificación