AlfredoSC   24-06-2021, 17:50
#1
Hola:

Estoy haciendo un programa en Cpp el cual ya compilado se carga en un microcontrolador.

El uC recibirá un pack de datos (22,34,34,176,90,20,60,0) que se definen de la siguiente manera:


#define dato0  recibe[0]
#define dato1  recibe[1]
#define dato2  recibe[2]
#define dato3  recibe[3]
#define dato4  recibe[4]
#define dato5  recibe[5]
#define dato6  recibe[6]
#define dato7  recibe[7]

int8 recibe[8];     // Éste es el Pack

Justo después de recibir el pack, se envía el mismo a una PC vía Serial (RS-232) en modo Bytes
(no string) de la siguiente manera:

putc(recibe[]);

Y en la PC, usando CuteCom en modo HEX como Software Serial, se recibe el pack como:

[0x16][0x22][0x22][0xB0][0x5A][0x14][0x3C][0x00]

Lo cual es correcto.

Pero si en vez de enviar recibe[], mando uno a uno sus componentes:

putc(dato0);
putc(dato1);
putc(dato2);
putc(dato3);
putc(dato4);
putc(dato5);
putc(dato6);
putc(dato7);

Recibo lo siguiente, que no es lo esperado:

[0x16][0x00][0x00][0x00][0x00][0x00][0x00][0x00]
[0x22][0x00][0x00][0x00][0x00][0x00][0x00][0x00]
[0x22][0x00][0x00][0x00][0x00][0x00][0x00][0x00]
[0xB0][0x00][0x00][0x00][0x00][0x00][0x00][0x00]
[0x5A][0x00][0x00][0x00][0x00][0x00][0x00][0x00]
[0x14][0x00][0x00][0x00][0x00][0x00][0x00][0x00]
[0x3C][0x00][0x00][0x00][0x00][0x00][0x00][0x00]
[0x00][0x00][0x00][0x00][0x00][0x00][0x00][0x00]

Lo cual provoca que mi proyecto no funcione, por el "exceso" de datos extras que vienen con
cada dato0,1,...7.

Admito que me cuesta trabajo entender los arreglos, porque tal parece que:

recibe[0] está compuesto por dato0[0], dato0[1], ......dato0[7]
recibe[1] está compuesto por dato1[0], dato1[1], ......dato1[7]

y así todos los demás.

De todos modos mando mi código completo en Cpp por si alguien tiene una idea de cómo solucionarlo.

Gracias.
Archivos adjuntos
.gz
18f14k50_cdc_usb_sc6928.c.tar.gz (Tamaño: 3 KB Descargas: 0)

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
tercoide   24-06-2021, 18:04
#2
Cpp usa column major para almacenar matrices, gambas usa row major. Luego tienes que reconvertir datos , por ejemplo para una matriz de 4x4 o sea 16 elementos:

C:
1  5  9 13
2  6 10 14
3  7 11 15
4  8 12 16

Gambas:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

si sabes las dimensiones de la matriz de antemano, no seria problema recibir datos en una matriz auxiliar y convertirlos.

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
AlfredoSC   28-06-2021, 18:39
#3
Gracias Tercoide, porque derivado de la información que me diste, encontré que al transmitir datos tipo Byte (Ejemplo 0xB3. 0xEA), por el SerialPort (Class) solo es posible hacerlo si la variable es tipo arreglo o matriz unidimensional de "n" elementos. Por qué lo pensó así Gambas? Habrá que ver el motivo y la razón.

No obstante si la variable es String simple (como 0x37, 0x20 en ASCII "7" y " ", respectivamente, si se admite como dato simple y/o único, si así se requiere.

Así que con éste conocimiento, tuve que hacer modificaciones en el código que va en el microcontrolador, para que diera tratamiento a los datos que llegan en matriz.

Yo quisiera que tincho tuviese un poco de tiempo para investigar ese comportamiento de SerialPort, porque sigue vigente como paso intermedio para comunicaciones USB, al crear puerto virtual tipo ttyACM0 y luego pasar los datos del Stream SerialPort, al Stream USB.


Saludos.

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.