Problemas con puerto ttyS0 (solucionado)

Imagen de xunet
0 puntos

Estimados, necesito enviar a un dispositivo por el puerto ttyS0 (com1) una secuencia de caracteres determinada, sin ningún carácter de control creo que es raw, en la notebook con windows XP el dispositivo responde sin ningún problema, cuando lo quiero hacer bajo ubuntu, ejecutando un bash el dispositivo ni se entera. El seteo del puerto serie es: 9600, sin paridad, 8 bits de dato y uno de stop.
Este es el bash:

#!/bin/bash -x
data="153 245 000 000 000 000 000 151 072 079 076 065 229 241"
sudo chmod 777 /dev/ttyS0
sudo stty 9600 cs8 -parenb -crtscts -echo -F /dev/ttyS0
echo $data > /dev/ttyS0

Eso es todo. pero que esta mal ? Alguin me podra dar una mano, gracias !!!
PD: como verán no soy muy entendido en ubuntu ... pero le estoy tomando el gustito !!!

Imagen de Gabriel_M
+1
0
-1

... instala cutecom

sudo su
apt-get update
apt-get install cutecom
cutecom

Su man page informa

 Name
cutecom - graphical serial terminal.
Synopsis
cutecom
Description
cutecom is a graphical serial terminal, like minicom. It is aimed mainly at hardware developers or other people who need a terminal to talk to their devices. It features lineoriented interface instead of character-oriented, xmodem, ymodem, zmodem support (requires the lrzsz package) and hexadecimal input and output among other things.
Options
cutecom doesn’t really have any command-line options. 
+1
0
-1
Imagen de xunet
+1
0
-1

Gracias Gabriel_M, logre conectarme con el dispositivo, siguiendo la sugerencia, solo que no se por que si mando el 153 en lugar de recibir 153, recibo 049 053 051, debe ser algo que me falta configurar del comando echo, que puede ser ?
Gracias por responder !!

+1
0
-1
Imagen de Gabriel_M
+1
0
-1

Imagen de xunet
+1
0
-1

Gracias nuevamente, si conozco la tabla ascii, el tema es que le con el comando echo envío un 153 y recibo en el dispositivo 049 053 051 y no el 153, que es lo que necesito recibir en el dispositivo, no se que como enviar con el comando echo o mejor dicho, por que me cambia lo que envío.

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

/**
* Ante todo, no se si esto te valdra.
* Quizas podrias probar esto:
* Guarda este comentario completo como un archivo de código c, por ejemplo raw.c
* compilalo con gcc -o raw raw.c
* A continuación ejecuta lo siguiente:
* raw 153 245 000 000 000 000 000 151 072 079 076 065 229 241 > archivo
* El contenido del archivo sera aproximadamente
* @Yu@@@@@WHOLAeq
* Si esto es lo que quieres mandar a ttyS0 cambia > archivo por > /dev/ttyS0
*/
#include
#include

main(int argc, char *argv[])
{
int i;

if(argc==1){
return 1;
}

i=0;

while(argv[i]!=NULL){
if(atoi(argv[i])>=0){
/* manda el código como un carácter */
printf("%c", atoi(argv[i]));
}
i++;
}

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

/**
* En el anterior comentario no se incluia un return 0; al final del archivo,
* este si esta correcto.
*
* Ante todo, no se si esto te valdra.
* Quizas podrias probar esto:
* Guarda este comentario completo como un archivo de código c, por ejemplo raw.c
* compilalo con gcc -o raw raw.c
* A continuación ejecuta lo siguiente:
* raw 153 245 000 000 000 000 000 151 072 079 076 065 229 241 > archivo
* El contenido del archivo sera aproximadamente
* @Yu@@@@@WHOLAeq
* Si esto es lo que quieres mandar a ttyS0 cambia > archivo por > /dev/ttyS0
*/
#include
#include

main(int argc, char *argv[])
{
int i;

if(argc==1){
return 1;
}

i=0;

while(argv[i]!=NULL){
if(atoi(argv[i])>=0){
/* manda el código como un carácter */
printf("%c", atoi(argv[i]));
}
i++;
}
return 0;
}

+1
0
-1
Imagen de xunet
+1
0
-1

Estimado Javier cuando compilo me tira estos error, y el c no es mi fuerte, podras sugerirme que hacer, gracias

raw.c:12:9: error: #include espera "NOMBRE_ARCHIVO" ó
raw.c:13:9: error: #include espera "NOMBRE_ARCHIVO" ó
raw.c: En la función ‘main’:
raw.c:25:16: error: ‘NULL’ no se declaró aquí (primer uso en esta función)
raw.c:25:16: nota: cada identificador sin declarar se reporta sólo una vez para cada función en el que aparece
raw.c:28:1: aviso: declaración implícita incompatible de la función interna ‘printf’ [activado por defecto]
raw.c:31:1: error: expected declaration or statement at end of input

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

El error es por mi culpa, en los los include son como sigue, los signos menor que y mayor que no los puse en el comentario porque use copiar y pegar y habia que formatearlos:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Los distintos errores eran por:

Faltaban los signos menor que y mayor que
------------------------------------
raw.c:12:9: error: #include espera "NOMBRE_ARCHIVO" ó
raw.c:13:9: error: #include espera "NOMBRE_ARCHIVO" ó
Al no haber podido incluir el archivo de cabecera se producen estos:
---------------------------------------------------------
raw.c: En la función ‘main’:
raw.c:25:16: error: ‘NULL’ no se declaró aquí (primer uso en esta función)
raw.c:25:16: nota: cada identificador sin declarar se reporta sólo una vez para cada función en el que aparece
raw.c:28:1: aviso: declaración implícita incompatible de la función interna ‘printf’ [activado por defecto]
Este se produce por la falta del return final y el parentesis, ahora voy a mandar el código corrrecto en otro comentario
raw.c:31:1: error: expected declaration or statement at end of input

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

/**
* Aqui he colocado los signos mayor que y menor que que en el comentario que mande no
* estaban
*
* En el anterior comentario no se incluia un return 0; al final del archivo,
* este si esta correcto.
*
* Ante todo, no se si esto te valdra.
* Quizas podrias probar esto:
* Guarda este comentario completo como un archivo de código c, por ejemplo raw.c
* compilalo con gcc -o raw raw.c
* A continuación ejecuta lo siguiente:
* raw 153 245 000 000 000 000 000 151 072 079 076 065 229 241 > archivo
* El contenido del archivo sera aproximadamente
* @Yu@@@@@WHOLAeq
* Si esto es lo que quieres mandar a ttyS0 cambia > archivo por > /dev/ttyS0
*/
#include <stdio.h>
#include <string.h>
#include <stdlig.h>

main(int argc, char *argv[])
{
int i;

if(argc==1){
return 1;
}

i=0;

while(argv[i]!=NULL){
if(atoi(argv[i])>=0){
/* manda el código como un carácter */
printf("%c", atoi(argv[i]));
}
i++;
}
return 0;
}

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

Otra opción para mandar códigos de carácteres a /dev/ttyS0 puede ser
la de utilizar un editor llamado joe, este editor permite entrar códigos
directamente en el archivo que se esta editángo pulsando la tecla
alt izquierda a la vez que el signo ?, en la parte inferior del
terminal aparece los siguiente:

Ctrl- (or 0-9 for dec. ascii, x for hex, or o for octal)

Pulsando lo adecuado se pueden entrar números decimales, hexadecimales u
octales y el resultado es de un carácter cada vez, por ejemplo si se pulsa
0, aparece la siguiente entrada igualmente en la parte inferior, el usuario
entra por ejemplo 27 (Código del carácter escape) y el carácter se inserta
en el editor

ASCII 0--

Si se quisiera entrar el código 233, en vez de pulsar 0 habria que pulsar el
2 y lo que apareceria seria lo siguiente, permitiendo entrar el 33

ASCII 2--

Una vez guardados los códigos en un archivo se puede utilizar cat para mandar
el archivo a /dev/ttyS0

Para instalar joe utilizar
sudo apt-get install joe

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

Ulilizando joe en el terminal el archiv guardado tendria para los códigos siguientes:
153 245 000 000 000 000 000 151 072 079 076 065 229 241
El siguiente contenido
<99>õ@@@@@<97>HOLAåñ

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/**
* Compilar con : gcc -o raw raw.c
* Crear un archivo con números de códigos, ej.
* 33
* 0
* 4
* 120
* La salida seria: !@Dx
* cat archivo | raw > /dev/ttyS0
*/
int main ()
{
FILE *Entrada;
char Cadena[8];

Entrada = stdin;

while(!feof(Entrada)){
fgets(Cadena, 10, Entrada);
if(!feof(Entrada)){
printf("%c", atoi(Cadena));
}
}
return 0;
}

+1
0
-1
Imagen de JAVIER NAVARRO ALTIMIRA
+1
0
-1

En el comantario anterior los include están incorrectos por mi culpa, en vez de formatear el texto con < lo he hecho con %lt;, substituir lo erróneo por los signos menor que y mayor que. El programa funciona mejor que lo que mande antes.

+1
0
-1
Imagen de xunet
+1
0
-1

Gracias Javier con todo lo que me escribiste pude, creo que en forma limitada reemplazar, el comando echo con este prog en c. Gracias nuevamente !!

#include <stdlib.h>
#include <string.h>
#include <stdio.h>


main(int argc, char *argv[])
{
int i;

if(argc==1){
return 1;
}

i=1;

while(argv[i]!=NULL){
if(atoi(argv[i])>=0){
/* manda el código como un carácter */
printf("%c", atoi(argv[i]));
}
i++;
}
return 0;
}
+1
0
-1