Google+ Room Technology: junio 2013

martes, 25 de junio de 2013

Mini2440: Aplicación de comunicación Serial usando QtCretor.

Unas de las principales razones por las que los sistemas embebidos son usados con mayor frecuencia es la posibilidad de usar interfaces de comunicación que les permitan interactuar con diferentes dispositivos. La interfaz mas usada en el mundo de la electrónica es la famosa comunicación serial. En el Mini2440 tenemos a nuestra disposición 4 puertos seriales: 1 RS-232 y 3 TTL. 

Ubicación de los puertos en el Mini2440. 

Durante mucho tiempo trate de usar el puerto serial en el Mini2440. En Windows CE usar el Serial Port   no es muy problemático pero es todo lo contrario en Linux QTopia. Después de varios intentos, la mayoría largos y fallidos, pude realizar una aplicación de Tx y Rx de datos entre el Mini2440 y la PC.  No me considero en lo mas mínimo experto en programación así que cualquier metida de pata de antemano disculpas.

¿De que va la aplicación?

La aplicación es simple: Transmisión/Recepción de datos (específicamente cadenas de texto) entre el Mini2440 y una computadora. Aquí una imagen de la aplicación:

Windows Form de la Aplicación del Mini2440. 

Tendremos tres botones: Para abrir el Puerto Serial, para cerrar el Puerto Serial y para escribir una cadena de caracteres en el Puerto Serial hacia la computadora
Un TextEdit multilínea donde se imprimirá los datos recibidos desde la computadora en el Mini2440. 

¿Que Necesito?
  • El Mini2440 debe estar ya preparado para correr aplicaciones hechas en Qt Creator, si no es así te recomiendo que leas este post.
  • Tener Qt Creator configurado con el compilador cruzado del Mini2440, si no es así te recomiendo leer este post.
  • Un cable USB-SERIAL para la computadora.
  • Los pines de los puertos seriales de ambos dispositivos deben de estar de la siguiente manera: TX con RX, RX con TX y ambas GND juntas. 
Consideraciones Generales importantes
  1. Tienes que tener un cierto grado de conocimiento de C++, no te pido que seas un máster en programación, solo los conocimientos suficientes.
  2. El uso del Puerto Serial no debe ser nada nuevo para ti, es decir debes saber que es el BaudRate, Bit de paridad, Bit de parada, RS-232, etc. 
  3. Haber hecho por lo menos una aplicación para el Mini2440 y comprobar su funcionamiento en el Mini2440. 
  4. Este post no lo considero una Guía paso a paso, por favor como mencione anteriormente debes manejarte fluidamente en Qt Creator. 

Descargar Librerías. 

En C++ las librerías son colecciones de clases y funciones escritas en un lenguaje que el núcleo del SO pueda entender.  Para realizar la comunicación serial para el Mini2440 se hace el uso de librerías que me permitan usar de manera eficiente el puerto físico. En el Internet hay muchas librerías para tal fin, yo use una en particular que para mi aplicación en especifico me ayudo de manera satisfactoria. 
Tomar en cuenta que esta no es la mejor librería que pueda haber, pero en esta aplicación trabaja perfectamente.  Descargar: Link

Creando la Aplicación: Incluyendo librerías en el Proyecto. 

Una vez descargadas las librerías descomprimimos los archivos y los copiamos a todos dentro de la carpeta raíz donde esta el proyecto creado en Qt Creator. Los archivos .h son los headers (encabezados) y los archivos .cpp son los sources (fuentes).

Estas librerías las tendremos que agregar al proyecto para ello vamos hacer lo siguiente: Hacemos clic derecho sobre la carpeta del proyecto y elijemos "Agregar archivos existentes".

Hacemos Clic derecho y elijemos "Agregar Archivos existentes.  


Los archivos en total son 8: PortListener.cpp, PortListener.h, posix_qextserialport.cpp, qextserialenumerator.h, qextserialenumerator_unix.cpp, qextserialport.cpp, qextserialport.h y qextserialport_global.h. Todos ellos los añadimos al proyecto.  

Una vez hecho esto darse cuenta como los archivos se agruparon.   

El archivo .pro también tiene que tener las siguientes modificaciones.   

Le damos al proyecto un Rebuild All y después un "Ejecutar" (por el momento no cambiamos al compilador del Mini2440). No tendría que haber problemas en este punto. 


Creando la Aplicación: Slots, variables, controles, etc. 

Le damos las siguientes dimensiones al mainwindow.iu (Height>>249;Width>>392).
Añadimos los tres botones y el EditText. Hay que declarar los slots privados correspondiente a cada uno de los botones.

En el mainwindow.cpp añadimos lo siguiente:

private:
    Ui::MainWindow *ui;
    QextSerialPort *port; //esta añadiremos, asignación de un nombre para hacer uso de las características del puerto serial. 


Ademas debemos incluir las librerías del Serial Port  de la siguiente manera:

#include "qextserialport.h" //esto va en el mainwindow.h
#include <qextserialenumerator.h>//esto va en el mainwindow.cpp
#include "qextserialport.h"            //esto va en el mainwindow.cpp

En el mainwindow.cpp debemos declarar el nombre del Serial Port que sera usado:

#define port_name "/dev/ttySAC0" //nombre del puerto del Mini2440 (COM1)

El código del botón para abrir el Puerto Serial se vería así:

void MainWindow::clic_open_port()
{
    this->port = new QextSerialPort(port_name, QextSerialPort::EventDriven);
    port->flush();
    port->setBaudRate(BAUD115200);//115200 de BAUDRATE
    port->setFlowControl(FLOW_OFF);//Sin Control de Flujo
    port->setParity(PAR_NONE);//Sin Paridad
    port->setDataBits(DATA_8);//8 bits de datos
    port->setStopBits(STOP_1);//1 bit de parada

    if (port->open(QIODevice::ReadWrite) == true)
    {
        connect(port,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
        ui->button_close_port->setEnabled(true);
        ui->button_write_data->setEnabled(true);
        ui->button_open_port->setEnabled(false);
    }
    else
    {
        QMessageBox::information(this, "ERROR DE SISTEMA", "Se intenta abrir un puerto inexistente");
    }
}

El código del botón para cerrar el Puerto Serial:

void MainWindow::clic_close_port()
{
    port->close();//cerramos el puerto
    ui->button_close_port->setEnabled(false);
    ui->button_write_data->setEnabled(false);
    ui->button_open_port->setEnabled(true);
}

El código del botón para escribir en el Serial Port una cadena de caracteres ya definida seria este:

void MainWindow::clic_write_port()/
{
    port->write("Hola Mini2440. ");
}

En el caso de la recepción de los datos debemos enlazar el Signal correspondiente con un Slot, primero declaramos un Slot privado en el mainwindow.h.

private slots:
    void clic_open_port();//slot correspondiente al boton open_port
    void clic_close_port();//slot correspondiente al boton close_port
    void clic_write_port();//slot correspondiente al boton write_port
    void onReadyRead();//slot correspondiente al evento de RX de bits del puerto

Seguido desarrollamos el código correspondiente al slot:

void MainWindow::onReadyRead()
{
    SleeperThread::msleep(20);
    QByteArray bytes=port->readAll();
    ui->textEdit->append(bytes);
}

Algo adicional es poder deshabilitar los botones "CLOSE PORT" y "WRITE DATA" si primero no se abrió el Serial Port de manera correcta. El código estaría dentro del método de inicialización del formulario:

    ui->button_close_port->setEnabled(false);
    ui->button_write_data->setEnabled(false);

Esto es todo lo necesario para poder ejecutar la aplicación, si tienen algún error durante la compilación o ejecución traten de revisar de nuevo el post.  Una vez compilada la aplicación en la PC es hora de hacer lo mismo pero con el compilador del Mini2440, recuerda que debe devolverte el famoso 255 para asegurarnos que todo esta bien. Copiamos al ejecutable a una SD o memoria USB , la pasamos al Mini2440 (a través de comandos, recomiendo usar el programa PUTTY) y ejecutamos la aplicación.  

Si el código les da problemas les dejare dos links con los proyectos de Qt Creator. En ellos estará la aplicación desarrollada tanto para PC como para el Mini2440, estas aplicaciones están trabajando perfectamente y no he tenido problemas.
Descargar: Link1 Link2

Para finalizar en la PC tienen que tener un programa que les permita usar en Puerto Serial para enviar cadena de caracteres y poder recibir de la misma manera caracteres. 

Espero que esta nuevo post les sirva (a mi este aplicación me saco de grandes apuros). No es una aplicación que lo tiene de todo y no solucionara todos los problemas que tengan, pero las librerías están disponibles, solo hay que tener la suficiente visión para aprovecharla al 100%.  Traten de experimentar es mi única recomendación. Modifiquen el código, añadan mas código, eliminen código tal vez que este inservible y  de esta manera estaran aprendiendo a usar el Serial Port. 
¡Suerte en sus proyectos!