QT qtserialport (problemas de recepcion)

606 views
Skip to first unread message

Jose Per

unread,
Apr 4, 2014, 6:02:37 PM4/4/14
to qt-es...@googlegroups.com
Hola a todos a todos llevo estudiando QT y C++ hace ya 8 meses (autodidacta) tengo un problema de recepcion :creo que es

por falta de conocimientos si algun amable lector me pude echar una mano mi problema es el siguiente :

mejor visitar este video en youtube :http://youtu.be/aCOnRledoj8

solo pido orientacion o ejemplos para asimilarlo ,gracias por todo  atentamente Pepepaco

Juan Carlos Benitez

unread,
Apr 4, 2014, 6:18:08 PM4/4/14
to qt-es...@googlegroups.com
El 04/04/14 19:02, Jose Per escribió:
--
Has recibido este mensaje porque estás suscrito al grupo "Qt-español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a qt-espanol+...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a qt-es...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/qt-espanol.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Hola, hay que ver como se envia la trama puede que para la temp 36 se envíe "36\n", entonces en qt tenes que leerte hasta un "\n" y no hacer readAll(), en la consola serial del ide de arduino, te muestra un numero bajo el otro, asique un "\n" seguro que va..



Lisandro Damián Nicanor Pérez

unread,
Apr 4, 2014, 7:03:18 PM4/4/14
to qt-es...@googlegroups.com, Juan Carlos Benitez
On Friday 04 April 2014 19:18:08 Juan Carlos Benitez wrote:
> El 04/04/14 19:02, Jose Per escribió:
> > Hola a todos a todos llevo estudiando QT y C++ hace ya 8 meses
> > (autodidacta) tengo un problema de recepcion :creo que es
> >
> > por falta de conocimientos si algun amable lector me pude echar una
> > mano mi problema es el siguiente :
> >
> > mejor visitar este video en youtube :http://youtu.be/aCOnRledoj8
> >
> > solo pido orientacion o ejemplos para asimilarlo ,gracias por todo
> > atentamente Pepepaco
>
> Hola, hay que ver como se envia la trama puede que para la temp 36 se
> envíe "36\n", entonces en qt tenes que leerte hasta un "\n" y no hacer
> readAll(), en la consola serial del ide de arduino, te muestra un numero
> bajo el otro, asique un "\n" seguro que va..

Probá con rawData();

--
Confucius say: He who play in root, eventually kill tree.

Lisandro Damián Nicanor Pérez Meyer
http://perezmeyer.com.ar/
http://perezmeyer.blogspot.com/
signature.asc

Miguel Richard

unread,
Apr 5, 2014, 2:51:19 AM4/5/14
to qt-es...@googlegroups.com
Hola, no es necesario hacer un "adjust" del label, quizas los datos vienen bien, pero el label los muestra mal
--
.o0- No se prive, use software libre, usted se lo merece -0o.

-- Bioing. Miguel A. Richard --
Bertel Holts Vej 7 St.
9400 Nørresundby, Denmark.
Tel: 0045 6015 2499

Jose Per

unread,
Apr 5, 2014, 3:29:45 PM4/5/14
to qt-es...@googlegroups.com

Hola de nuevo ,he re diseñado el programa para en vez de mandar los datos continuamente, para que me de la temperatura  cada vez que pulso un botón .
    http://youtu.be/k-fUObT80jw   También he re diseñado la gui ,pero como veis sigo teniendo el mismo problema .

También me gustaría saber como puedo ver una gráfica de la señal analógica con curvas de subida y bajada  con voltaje y frecuencia,y como puedo ver la temperatura de otro modo si el problema es de "ui->label".
gracias por todo                    pepepaco


 

Juan Carlos Benitez

unread,
Apr 5, 2014, 4:56:17 PM4/5/14
to qt-es...@googlegroups.com

Es que sigues usando la misma rutina de lectura, por eso tienes el mismo resultado.
Pone un control del tipo textplaint y visualiza todos los datos que capture tu rutina, los datos deben estar concatenados cuida que tu rutina de inserción en el textplaint no introduzca saltos de linea.
Con la prueba anterior deberías tener una salida similar a la consola serie del idea arduino que mostraste en el primer vídeo.
Problema del label es poco probable  ya que por momentos se puede ver bien las dos cifras y luego una cifra nuevamente dos cifras.

--

Juan Carlos Benitez

unread,
Apr 6, 2014, 10:54:57 PM4/6/14
to qt-es...@googlegroups.com
Modifica el método

void MainWindow::serialReceived()
{
    ui->label->setText(serial->readAll());
    ui->label->adjustSize();
}

por

void MainWindow::serialReceived()
{
    int size = serial->bytesAvailable();
    qDebug() << size;
    if ( size> 1) { /* 1 es para dos cifras podes modificar en funcion de las cifras a leer. */
        QString str = serial->readLine();
        ui->label->setText(str);
    }
}
saludos jc
 

Jose Per

unread,
Apr 7, 2014, 6:54:50 AM4/7/14
to qt-es...@googlegroups.com
Hola a todos, gracias por todo de antemano ,gracias por el código a jc:(funciona a la perfección)
Pero he cometido un"GRABE ERROR" me explico:
estoy mandando desde el micro-controlador una cadena de texto que no puedo convertir en datos.
culpa mía por estar acostumbrado a trabajar por "consola".
Creo que si mando un dato desde el micro ,este dato después lo puedo pasar a texto.
que cadena de datos se utiliza mas BIN,HEX,DEC,BIN... Quiero aclarar que no tengo estudios
informaticos (Analfabeto),tendre que estudiar mas ,y todo lo aprendido es de videos tutoriales de youtube y san google.

gracias por todo, atentamente 
                                  pepepaco
   

Lisandro Damián Nicanor Pérez

unread,
Apr 7, 2014, 8:44:33 AM4/7/14
to qt-es...@googlegroups.com
On Monday 07 April 2014 03:54:50 Jose Per wrote:
> Hola a todos, gracias por todo de antemano ,gracias por el código a
> jc:(funciona a la perfección)
> Pero he cometido un"GRABE ERROR" me explico:
> estoy mandando desde el micro-controlador una cadena de texto que no puedo
> convertir en datos.
> culpa mía por estar acostumbrado a trabajar por "consola".
> Creo que si mando un dato desde el micro ,este dato después lo puedo pasar
> a texto.
> que cadena de datos se utiliza mas BIN,HEX,DEC,BIN... Quiero aclarar que no
> tengo estudios
> informaticos (Analfabeto),tendre que estudiar mas ,y todo lo aprendido es
> de videos tutoriales de youtube y san google.

Es lo mismo, siempre y cuando en el receptor sepas deciridr que es y actuar en
consecuencia :)

--
Evite los parámetros estáticos. Si son inevitables, haga que el emisor
y el receptor negocien un valor.
Andrew S. Tanenbaum, de su libro "Computer Networks"
signature.asc

Jose Per

unread,
Apr 7, 2014, 1:30:27 PM4/7/14
to qt-es...@googlegroups.com

Bueno gracias por todo,ya no quiero molestaros mas ,me he dado cuenta que antes tendre que estudiar muncho mas c++ porque estoy muy verde
pero tengo una ultima pregunta:
como puedo cambiar el setvalue (valor)  pogressbar (ui->pogressbar,slot(setvalue(int); con el valor recibido por el puerto serie. si es que se puede

gracias por todo y a todos por ser tan amable
                                            Atentamente pepepaco

Lisandro Damián Nicanor Pérez

unread,
Apr 7, 2014, 3:26:50 PM4/7/14
to qt-es...@googlegroups.com, Jose Per
On Monday 07 April 2014 10:30:27 Jose Per wrote:
> Bueno gracias por todo,ya no quiero molestaros mas ,me he dado cuenta que
> antes tendre que estudiar muncho mas c++ porque estoy muy verde
> pero tengo una ultima pregunta:
> como puedo cambiar el setvalue (valor) pogressbar
> (ui->pogressbar,slot(setvalue(int); con el valor recibido por el puerto
> serie. si es que se puede

Se puede. En ppio. vos deberías recibir un string con el número. La idea es
convertir el string a entero y usarlo en ése valor. Pseudocódigo para
ilustrar:

QString elValor = puertoSerie.metodoQueDevuelvaElString();

int valorEntero = elValor.toInt(/*Los parámetros que sean necesarios*/)

ui->progressBar.setValue(elValor);

Obviamente podrías simplificarlo a:

ui-
>progressBar.setValue(QString(puertoSerie.metodoQueDevuelvaElString()).toInt(/*
Parámetros */));

--
signature.asc

Jose Per

unread,
Apr 8, 2014, 7:34:19 AM4/8/14
to qt-es...@googlegroups.com
Hola a todos ,gracias de nuevo por todo. lisandro me ha aconsejado pasar un string a entero,para mover el progressbar,lo que es pasar a un tentero  lo comprendo,pero del string no se nada asi que me toca a estudiar, gracias por todo
                                           pepepaco

Jose Per

unread,
Apr 8, 2014, 11:53:39 AM4/8/14
to qt-es...@googlegroups.com

gracias a ustedes tengo ya casi el codigo  este funciona:
           QString str = serial->readAll();
             int num= str.toInt();
        ui->progressBar->setValue(num);

pero todavia se me  resiste, tengo dos problemas :
el 1º que es que los 20 grados los marca como 40 el el pogressbar
el segundo que esta igual que al principio que pasa del 21 al 1  o a cero ,si le meto el codigo que me paso jc, va bien, pero marcando el doble.he dividido el serultado entre dos, pero me  marca los grados de dos en dos 24,26,28 etc  ,en vez de uno a uno 24,25,25 y lo ultimo que debo mirar para leer mas  puertos del micro al mismo tiempo

                        gracias por todo de antemano:
                                                 pepepaco


Lisandro Damián Nicanor Pérez

unread,
Apr 8, 2014, 11:59:14 AM4/8/14
to qt-es...@googlegroups.com
On Tuesday 08 April 2014 08:53:39 Jose Per wrote:
> gracias a ustedes tengo ya casi el codigo este funciona:
> QString str = serial->readAll();
> int num= str.toInt();
> ui->progressBar->setValue(num);

Vas a necesitar aprender a debuggear lo que readAll() te está devolviendo.

Podés llegar a verlo en qt creator en modo debug. Otra forma es guardando la
salida a un archivo y analizándola con un editor hexadecimal como okteta
signature.asc

Juan Carlos Benitez

unread,
Apr 8, 2014, 3:24:17 PM4/8/14
to qt-es...@googlegroups.com
El 08/04/2014 12:59 p.m., Lisandro Damián Nicanor Pérez Meyer escribió:
> On Tuesday 08 April 2014 08:53:39 Jose Per wrote:
>> gracias a ustedes tengo ya casi el codigo este funciona:
>> QString str = serial->readAll();
>> int num= str.toInt();
>> ui->progressBar->setValue(num);
> Vas a necesitar aprender a debuggear lo que readAll() te está devolviendo.
>
> Podés llegar a verlo en qt creator en modo debug. Otra forma es guardando la
> salida a un archivo y analizándola con un editor hexadecimal como okteta
>


Te paso el codigo para el arduino y para Qt, vas a tener que hacer lo
que recomienda Lisandro
> Vas a necesitar aprender a debuggear
saludos jc
send_temp_arduino.zip
serialport.zip

Jose Per

unread,
Apr 9, 2014, 5:52:25 AM4/9/14
to qt-es...@googlegroups.com

Gracias a todos por todo ,perdonen que le haya molestado tanto ,pero tengo ganas de aprender ,
he estado googleando  y parece ser que se utiliza raw data, tengo muncho que aprender ,desde aqui solo agradecerle su amable ayuda .

                                atentamente pepepaco

Juan Carlos Benitez

unread,
Apr 9, 2014, 5:55:32 AM4/9/14
to qt-es...@googlegroups.com
El 09/04/14 06:52, Jose Per escribió:

Gracias a todos por todo ,perdonen que le haya molestado tanto ,pero tengo ganas de aprender ,
he estado googleando  y parece ser que se utiliza raw data, tengo muncho que aprender ,desde aqui solo agradecerle su amable ayuda .

                                atentamente pepepaco
--
Has recibido este mensaje porque estás suscrito al grupo "Qt-español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a qt-espanol+...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a qt-es...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/qt-espanol.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Hola, el código que te pase en correo anterior para arduino y qt te anduvieron?

Jose Per

unread,
Apr 10, 2014, 9:04:59 AM4/10/14
to qt-es...@googlegroups.com
Como siempre, agradecerles todo de antemano ,gracias
Hola jc el código funciona bien, lo único (que al principio no funcionaba),al echar un vistazo al código ,
fue solamente cambiar el com10 por  /dev/ttyACM0.Tambien me he dado cuenta la forma de ir poniendo el código ,limpiamente:Create_port( ) ,create_ connection( ); y me falta create_out:
Ejecutando el programa ,me he dado cuenta que el debut me manda un error cada cuatro datos,
he estado investigando a ver si descubro el error,parece ser que manda los datos con 64 bit,es decir.
4 paquetes de 1byte (o 4 paquetes de  8bit),pero no lo tengo claro por que me hablaba de bufer,entonces  no se si son 64bytes (estaríamos ablando de la capacidad de la memoria que puede entregar al bufer) ,o de cuatro paquetes de 1byte al puerto serie, he aqui mi duda.                (la información estaba en ingles ); creo que en la comunicación el micro sigue dando datos y este o el programa debería darle una instrucción de parada.Sabéis por donde pueden ir los tiros:

                                       Atentemente pepepaco


Message has been deleted

Juan Carlos Benitez

unread,
Apr 10, 2014, 4:08:20 PM4/10/14
to qt-es...@googlegroups.com
--
Has recibido este mensaje porque estás suscrito al grupo "Qt-español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a qt-espanol+...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a qt-es...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/qt-espanol.
Para acceder a más opciones, visita https://groups.google.com/d/optout.


Lo que te parece que es una perdida de datos, realmente no es perdida de
dato, si miras el string esta vacío, y la cantidad de datos en el buffer
es menor que 4, pasa que el sof detecta un evento pero la cantidad de datos no es suficiente para realizar la conversión.

**esto se debe a que;

* la sincronización  de lectura del puerto es por evento de llegada de datos al buffer, entonces cuando se produce el evento se emite un signal se dispara el slot de lectura pero que aya datos en el buffer no quiere decir que esten todos los datos puede que solo aya un caracter 1 byte y el evento se va a disparar igual, por eso es necesario comprobar cuantos datos hay en el buffer.

* La forma eficiente de corregir es usar un evento especifico, por ejempo que solo se dispare el signal cuando se recibe un "\n", cr+lf. , por lo que vi en el código fuente del driver QSerialPort, no esta preparado todavía para soportar esta forma de lectura, claro que se podría hacer unos cambios y agregar esta característica, o esperar por ahí  mas adelante los desarrolladores agreguen esta característica.

* Otra forma usar una transferencia sincrónica, porque la forma en que
estas trabajando se lo conoce como  asincrónica, claro que vas a tener
que respetar un cierto protocolo.

saludos jc

pdta: anteriormente puse un mensaje que lo borre para evitar confución ya que se me mezclaron los temas jajaj de un foro de micro controladores, perdón.

Jose Per

unread,
Apr 11, 2014, 9:36:46 AM4/11/14
to qt-es...@googlegroups.com
Hola a todos y gracias de antemano ,bueno gracias por sacarme de la duda jc.
Es verdad lo que dices el qtserialport tiene problemas,estuve mirando un poco el código de firmata un programa hecho en qt ,y parece que utiliza un serial de C++.
gracias a ustedes ,lo que quería hacer, es posible hacerlo, y me ha quedado un programa terminado.
gracias por su ayuda ,y perdonen mi falta de conocimientos,seguiré investigando por la red  
                                          atentemente pepepaco


Jose Per

unread,
Apr 12, 2014, 9:53:58 AM4/12/14
to qt-es...@googlegroups.com

hola a todos solo dejaros el video de lo realizado :     http://youtu.be/Uga_s7gQDVg

                  gracias por todo atentamente .

                                                      pepepaco

Jose Per

unread,
Apr 14, 2014, 1:43:37 PM4/14/14
to qt-es...@googlegroups.com

Hola a tod@s ,he estado probando con (terminal) ejemplos de qtserialport  y parece que funciona a la perfección y sin perdidas de datos cuando recibe la trama desde arduino .creo que el  fallo esta en mi código que es bastante simple,
simplemente comentarles mi observación.
                                     atentamente pepepaco
   

Jose Per

unread,
Apr 22, 2014, 11:35:12 AM4/22/14
to qt-es...@googlegroups.com
Hola a todos de nuevo ,agradecerles su infinita paciencia ,he encontrado este código  que párese que da menos errores
 
{
    if (serial->canReadLine()) {
           QByteArray inByteArray  = serial->readLine();
           qDebug()<< inByteArray;
           ui->label->setText(inByteArray);
    }
en el debug no se ven errores, pero no se como pasarlo como valor numerico para interactuar con el progressbar .

gracias por todo de antemano
                                 atentamente pepepaco



Miguel Richard

unread,
Apr 22, 2014, 2:15:52 PM4/22/14
to qt-es...@googlegroups.com
No uses un QByteArray, en su reemplazo usa el QDataStream. Este ultio puede ser inicializado con un QByteArray y te permite transformarlo a enteros y strings facilmente. Ademas te aconsejo leer la documentacion de QT que es basta, extensa y detallada.

Saludos


--
Has recibido este mensaje porque estás suscrito al grupo "Qt-español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a qt-espanol+...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a qt-es...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/qt-espanol.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Jose Per

unread,
Apr 22, 2014, 3:55:57 PM4/22/14
to qt-es...@googlegroups.com

gracias por tu repuesta

                              pepepaco

Jose Per

unread,
Apr 22, 2014, 4:57:18 PM4/22/14
to qt-es...@googlegroups.com

Gracias a todos   ,he querido seguir utilizando qtserialport para que sea compatible con todos los sistemas (windows,linux,mac,etc) este es el codigo que al final voy a utilizar :

void MainWindow::serialreceived()

{
    if (serial->canReadLine()) {
              QByteArray QDataStream  = serial->readLine();
              qDebug()<<QDataStream;
              ui->label->setText(QDataStream);
             
  }
}

gracias a todos por su paciencia,espero que a alguien le sea de utilidad
                                                       se despide atentamente
                                                                                pepepaco 
Reply all
Reply to author
Forward
0 new messages