C/Visual C - Diferencia entre char y unsigned char

 
Vista:

Diferencia entre char y unsigned char

Publicado por jaldonfer (31 intervenciones) el 08/09/2016 20:59:22
Hola a todos:

Estoy haciendo un programa que envía datos datos por el puerto serie.

Me da algún problema y no sé por qué me está ocurriendo. Los problemas son aleatorios y los resultados es que las tramas envío al dispositivo con el que me comunico, no siempre las interpreta correectamente.

El tema es que las variables que he declarado para almacenar los datos que se envían ( es decir la vairable que parametrizo en las funciones write y recv ) son de tipo char. Mi duda es si esto está bien hecho y me pueda estar dando problemas.

¿ Para este caso sería mejor utilizar unsigned char ?

He realizado pruebas en uin programilla de test a parte con variables de ambos tipos y a ni vel de bits, los resultados son los mismos, por lo que creo que no hay diferencia... aunque la realidad es que el programa no funciona correctamente.

Puede ser el problema el que estoy utilizando tipos "char " ?

Hasta lo que tengo entendido entre los tipos char y los unsigned char, la unica diferencia entre ellos es que en los char el ultimo bit se utiliza para interpretar el signo. Esto entiendo que sea un problema si estuviese trabajando con valores BYTE a BYTE, pero lo que en realidad hago es trabajar con cadenas de char ( o como yo lo interpreto listados de bytes )

Estoy un poco perdido. ¿ Pueden ayudarme ?

Muchas Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Diferencia entre char y unsigned char

Publicado por Chema (234 intervenciones) el 08/09/2016 22:43:09
¿Acentos?

¿Los dispositivos son de un hardware parecido?, es decir, procesador que lea del mismo lado las variables.
Si puedes, coloca algún trozo de código relevante.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por jaldonfer (31 intervenciones) el 08/09/2016 23:05:10
Hola:

Se trata de un telegrama que envío y lo cierto es que no tengo en cuenta si hay ó no acentos. Envío un "churro" de bytes. Si lo intento pintar en pantalla sin formatearlo en hexadecimal, salen caracteres extraños, pero entiendo que eso es normal. De todas formas para trazar lo que "va y viene", lol trazo en hexadecimal.

Desconozco el hadrware del dispositivo con el que me comunico. Solo sé la estructura del telegrama que le tengo que enviar e interrpretar lo que me responde. Lo que si es seguro es que NO es un PC.

¿ A que te refieres con "coloca algún tro de código relevante" ?


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por Chema (234 intervenciones) el 08/09/2016 23:17:56
¿sistema operativo ?

¿Churro de bytes?, ¿formateo hexadecimal?, suena bien, parece interesante.

Yo entiendo mejor el código que las palabras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por jaldonfer (31 intervenciones) el 08/09/2016 23:39:54
De acuerdo. Hago algo como lo siguiente ( no tengo el código original aqui. )

//Declaración de variables auxiliares
char Lcl_Bytes[100] = "";
char Lcl_Buff[100] = "";

//Inicializar variables auxiliares
memset(Lcl_Bytes, 0, sizeof(Lcl_Bytes));
memset(Lcl_Buff, 0, sizeof(Lcl_Buff));


//Asignamos valores para enviar
( Los datos que envío me vienen de otra variable de la que necesito cartar trozos para construir el telegrama a enviar )
Lcl_Bytes[0] = 0xAD;
Lcl_Bytes[1] = 0xAD;
Lcl_Bytes[2] = 0x13;
Lcl_Bytes[3] = 0x68;
Lcl_Bytes[4] = 0xF2;
Lcl_Bytes[5] = 0x01;
Lcl_Bytes[6] = 0x4B;
Lcl_Bytes[7] = 0x8A;

Los valores hexadecimales que he puesto son al azahar, pero son valores que me suena que se envían habitualmente



//Asignar bytes para enviar
memcpy(Lcl_Buff, 0, Lcl_Bytes, 0, 8);


//Enviar datos
Lcl_CantBytesSend = write ( Lcl_Fd,
Lcl_Buff
)


El resultado es que envía 8 bytes sin problemas pero como indicaba en la consulta inicial me da algún problema y no sé por qué me está ocurriendo. Los problemas son aleatorios y los resultados es que las tramas envío al dispositivo con el que me comunico, no siempre las interpreta correectamente.


Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por Chema (234 intervenciones) el 08/09/2016 23:33:51
Prueba esto, a lo mejor da buenos resultados.

1
2
3
4
5
6
7
8
9
10
11
12
13
void PrintChurro(unsigned char *churro , int sizechurro){
	int i;
	unsigned char *p;
 
	p = churro;
 
	for ( i = 0; i < sizechurro; i++) {
		if ( i %24 == 0)
			printf("\n");
		printf("%u-",*p);
		p++;
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
void PrintChurro(char *churro , int sizechurro){
	int i;
	unsigned char *p;
 
	p = (unsigned char*)churro;
 
	for ( i = 0; i < sizechurro; i++) {
		if ( i %24 == 0)
			printf("\n");
		printf("%u-",*p);
		p++;
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por jaldonfer (31 intervenciones) el 08/09/2016 23:48:51
Ya lo he probado;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
 
void PrintChurro01(unsigned char *churro , int sizechurro){
	int i;
	unsigned char *p;
	p = churro;
	for ( i = 0; i < sizechurro; i++) {
		if ( i %24 == 0)
			printf("\n");
		printf("%u-",*p);
		p++;
	}
}
 
void PrintChurro02(char *churro , int sizechurro){
	int i;
	unsigned char *p;
	p = (unsigned char*)churro;
	for ( i = 0; i < sizechurro; i++) {
		if ( i %24 == 0)
			printf("\n");
		printf("%u-",*p);
		p++;
	}
}
 
int main()	{
	unsigned char Lcl_Var01[10] = "HOLA MUNDO";
	char Lcl_Var02[10] = "HOLA MUNDO";
 
	PrintChurro01(Lcl_Var01 , sizeof(Lcl_Var01));
	PrintChurro02(Lcl_Var02 , sizeof(Lcl_Var02));
return 0;
}


... y en ambos casos pinta lo mismo por pantalla:
72-79-76-65-32-77-85-78-68-79-
72-79-76-65-32-77-85-78-68-79-

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por Chema (234 intervenciones) el 09/09/2016 00:01:10
Si no es tema de impresión, puede ser que:

Jugar con, char Lcl_Bytes[100] y hexadecimal, queda limitado a OxFF, si, no se supera el valor, correcto, de lo contrario , puede pasar cualquier cosa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por jaldonfer (31 intervenciones) el 09/09/2016 00:10:27
Perdona, pero no entiendo lo que quieres decir....

Un char y un unsigned char ocupan lo mismo, 8 bits, no ?

Entonces que más da el valor que sea, son unos y ceros: 8 por cada byte siempre. Al enviar por el puerto serie con la funcion write, se tiene en cuenta el tipo de dato que es ? Yo lo que entiendo es que sean del tipo que sean tienen que llegar tal cual, no ?

Hay algún concepto que no tengo bien pillado ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia entre char y unsigned char

Publicado por chema (234 intervenciones) el 09/09/2016 00:38:59
Un char y un unsigned char ocupan lo mismo, 8 bits, no ? Si.

Al enviar por el puerto serie con la funcion write, se tiene en cuenta el tipo de dato que es ? No.

Hay algún concepto que no tengo bien pillado ? No,



Si es un error aleatorio, respira hondo, limpia tu mente, y mirarlo todo como si no lo conocieras. Muchas veces tenemos el error delante , es una tontería y no lo vemos si no nos pegamos nosotros mismos un buen "reset"

Mira esto y a lo mejor te inspiras y localizas el fallo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void PrintChurro(char *churro , int sizechurro){
	int i;
	unsigned char *p;
 
	p = (unsigned char*)churro;
 
	for ( i = 0; i < sizechurro; i++) {
		if ( i %4 == 0)
			printf("\n");
		printf("%u-",*p);
		p++;
	}
}
 
 
 
int main(void){
	int i;
	int x;
	int k;
	char *p;
	char *churro;
	srand (time(NULL));
	churro = malloc(8192);
	memset(churro,0x0, 8192);
	x = 0;
 
	for ( i = 0; i < 10; i++){
		p = (char*)&i;
		memcpy(churro + x, p, sizeof(int));
		x += sizeof(int);
	}
	PrintChurro(churro,10 *sizeof(int));
	printf("\n------");
 
	x = 0;
	for ( i = 0; i < 12; i++){
		k = (rand() % 26 + 'a');
		memcpy(churro + x, &k,1 );
		x += 1;
	}
 
	PrintChurro(churro,12);
	return 0;
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Diferencia entre char y unsigned char

Publicado por jaldonfer (31 intervenciones) el 09/09/2016 08:57:14
Hola:

Ante todo gracias por la ayuda.

Después de unas horas de descanso e intertar autoresetearme, he analizado el código, lo he entendido, lo he probado e incuso he realizado cambios en los tipos de datos entre char y unsigned char y los resultados siempre son los mismos. Pego aquí el código que he probado con los cambios realizados ( básicamente he creado nuevas variables y funciones con el sufijo "2" para utilizar unsigned char ).

Pego aquí el código modificado con el que he realizado pruebas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
void PrintChurro(char *churro , int sizechurro){
	int i;
	//unsigned char *p;
	char *p;
	//p = (unsigned char*)churro;
	p = (char*)churro;
 
	for ( i = 0; i < sizechurro; i++) {
		if ( i %4 == 0)
			printf("\n");
		printf("%u-", *p);
		p++;
	}
}
 
void PrintChurro2(unsigned char *churro , int sizechurro){
	int i;
	unsigned char *p;
	p = (unsigned char*)churro;
 
	for ( i = 0; i < sizechurro; i++) {
		if ( i %4 == 0)
			printf("\n");
		printf("%u-", *p);
		p++;
	}
}
 
int main(void)	{
	int i;
	int x;
	int k;
	char *p;
	unsigned char *p2;
	char *churro;
	unsigned char *churro2;
	srand (time(NULL));
	churro = malloc(8192);
	churro2 = malloc(8192);
	memset(churro,0x0, 8192);
	memset(churro2,0x0, 8192);
	x = 0;
 
	for ( i = 0; i < 10; i++){
		p = (char*)&i;
		p2 = (unsigned char*)&i;
		//printf("\nAddr: [%p] - [%p]", &i, p);
		memcpy(churro + x, p, sizeof(int));
		memcpy(churro2 + x, p2, sizeof(int));
		x += sizeof(int);
		}
	PrintChurro(churro,10 *sizeof(int));
	PrintChurro2(churro2,10 *sizeof(int));
 
	printf("\n----------------------------------\n");
	memset(churro,0x0, 8192);
	memset(churro2,0x0, 8192);
 
	x = 0;
	for ( i = 0; i < 12; i++)	{
		k = (rand() % 26 + 'a');
		//printf("\nAddr: [%d] - [%p]", k, &k);
		memcpy(churro + x, &k, 1);
		memcpy(churro2 + x, &k, 1);
		x += 1;
		}
	PrintChurro(churro,12);
	PrintChurro2(churro2,12);
	return 0;
	}



y los resultados de ejecutar esto son:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
0-0-0-0-
1-0-0-0-
2-0-0-0-
3-0-0-0-
4-0-0-0-
5-0-0-0-
6-0-0-0-
7-0-0-0-
8-0-0-0-
9-0-0-0-
0-0-0-0-
1-0-0-0-
2-0-0-0-
3-0-0-0-
4-0-0-0-
5-0-0-0-
6-0-0-0-
7-0-0-0-
8-0-0-0-
9-0-0-0-
----------------------------------
 
107-110-108-122-
111-110-114-101-
111-107-118-109-
107-110-108-122-
111-110-114-101-
111-107-118-109-


La verdad es que no sé si estoy bloqueado, hay algo que no entiendo, algo que estoy haciendo mal.....

También sospecho de que el dispositivo con el que me comunico es algo inestable y me está volviendo loco.

Hay algo que aún no he visto ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar