🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
9 messages
9 total messages Started by Eismann Thu, 04 May 2006 12:15
Enviar ctrl-z por el puerto serie
#1071
Author: Eismann
Date: Thu, 04 May 2006 12:15
60 lines
3384 bytes
Holas,

Estoy haciendo un programa para enviar SMS con un modem que está
conectado al puerto serie.
El programa funciona en mi ordenador, pero a la hora de llevarlo a
uClinux (linux empotrado) se queda tonto.
El problema que tengo es que para indicarle al modem que se ha
terminado de redactar el mensaje, hay que mandarle el carácter ctrl-z
(0x1A), y parece ser que no le llega al modem, que se queda frito
esperando hasta que llegue el dichoso caracter.

Supongo que será porque es un caracter de control y los drivers del
puerto serie lo tratan de otra manera, y no lo mandan, pero ya no sé
que probar para que le llegue al modem.

Pongo aqui como inicializo termios:

----------------------
/* Esto para abrir el modem */
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );

[...]

newtio->c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio->c_iflag = IGNPAR | ICRNL;
newtio->c_oflag = OCRNL;
newtio->c_lflag = ICANON;

newtio->c_cc[VINTR]    = 0;     /* Ctrl-c */
newtio->c_cc[VQUIT]    = 0;     /* Ctrl-\ */
newtio->c_cc[VERASE]   = 0;     /* del */
newtio->c_cc[VKILL]    = 0;     /* @ */
newtio->c_cc[VEOF]     = 4;     /* Ctrl-d */
newtio->c_cc[VTIME]    = 0;     /* inter-character timer unused */
newtio->c_cc[VMIN]     = 1;     /* blocking read until 1 character
arrives */
newtio->c_cc[VSWTC]    = 0;     /* '\0' */
newtio->c_cc[VSTART]   = 0;     /* Ctrl-q */
newtio->c_cc[VSTOP]    = 0;     /* Ctrl-s */
newtio->c_cc[VSUSP]    = 0;     /* Ctrl-z */
newtio->c_cc[VEOL]     = 0;     /* '\0' */
newtio->c_cc[VREPRINT] = 0;     /* Ctrl-r */
newtio->c_cc[VDISCARD] = 0;     /* Ctrl-u */
newtio->c_cc[VWERASE]  = 0;     /* Ctrl-w */
newtio->c_cc[VLNEXT]   = 0;     /* Ctrl-v */
newtio->c_cc[VEOL2]    = 0;     /* '\0' */

tcsetattr(fd,TCSANOW,newtio);
--------------------

Lo que no sé es por qué en el ordenador me funciona, pero luego con
uClinux no. En el ordenador tengo el kernel 2.6 y con uClinux uso el
2.4.

¿Álguien sabe como hacer para mandar caracteres especiales por el
puerto serie? Por lo menos para saber si lo estoy haciendo bien y
buscar el error por otro lado.

  Saludos,
  Eismann.
Re: Enviar ctrl-z por el puerto serie
#1074
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Thu, 04 May 2006 19:41
67 lines
3800 bytes
Hola "Eismann" <g.eismann@gmail.com>
el 4 May 2006 05:15:01 -0700 escribiste:

> Holas,
> 
> Estoy haciendo un programa para enviar SMS con un modem que está
> conectado al puerto serie.
> El programa funciona en mi ordenador, pero a la hora de llevarlo a
> uClinux (linux empotrado) se queda tonto.
> El problema que tengo es que para indicarle al modem que se ha
> terminado de redactar el mensaje, hay que mandarle el carácter ctrl-z
> (0x1A), y parece ser que no le llega al modem, que se queda frito
> esperando hasta que llegue el dichoso caracter.
> 
> Supongo que será porque es un caracter de control y los drivers del
> puerto serie lo tratan de otra manera, y no lo mandan, pero ya no sé
> que probar para que le llegue al modem.
> 
> Pongo aqui como inicializo termios:
> 
> ----------------------
> /* Esto para abrir el modem */
> fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
> 
> [...]
> 
> newtio->c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
> newtio->c_iflag = IGNPAR | ICRNL;
> newtio->c_oflag = OCRNL;
> newtio->c_lflag = ICANON;
> 
> newtio->c_cc[VINTR]    = 0;     /* Ctrl-c */
> newtio->c_cc[VQUIT]    = 0;     /* Ctrl-\ */
> newtio->c_cc[VERASE]   = 0;     /* del */
> newtio->c_cc[VKILL]    = 0;     /* @ */
> newtio->c_cc[VEOF]     = 4;     /* Ctrl-d */
> newtio->c_cc[VTIME]    = 0;     /* inter-character timer unused */
> newtio->c_cc[VMIN]     = 1;     /* blocking read until 1 character
> arrives */
> newtio->c_cc[VSWTC]    = 0;     /* '\0' */
> newtio->c_cc[VSTART]   = 0;     /* Ctrl-q */
> newtio->c_cc[VSTOP]    = 0;     /* Ctrl-s */
> newtio->c_cc[VSUSP]    = 0;     /* Ctrl-z */
> newtio->c_cc[VEOL]     = 0;     /* '\0' */
> newtio->c_cc[VREPRINT] = 0;     /* Ctrl-r */
> newtio->c_cc[VDISCARD] = 0;     /* Ctrl-u */
> newtio->c_cc[VWERASE]  = 0;     /* Ctrl-w */
> newtio->c_cc[VLNEXT]   = 0;     /* Ctrl-v */
> newtio->c_cc[VEOL2]    = 0;     /* '\0' */
> 
> tcsetattr(fd,TCSANOW,newtio);
> --------------------
> 
> Lo que no sé es por qué en el ordenador me funciona, pero luego con
> uClinux no. En el ordenador tengo el kernel 2.6 y con uClinux uso el
> 2.4.
> 
> ¿Álguien sabe como hacer para mandar caracteres especiales por el
> puerto serie? Por lo menos para saber si lo estoy haciendo bien y
> buscar el error por otro lado.

¿Qué es MODEMDEVICE?
¿Qué funciones utilizas para "escribir" en el puerto serie?

-- 
Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es>
PGP key 2861C704 --- F206 5671 6789 425D 111C  1302 214F 1934 2861 C704
Re: Enviar ctrl-z por el puerto serie
#1075
Author: Eismann
Date: Fri, 05 May 2006 08:36
4 lines
1377 bytes
MODEMDEVICE es /dev/ttyS1

para escribir uso write(fd, "mensaje\x01A",  8), por ejemplo.
Re: Enviar ctrl-z por el puerto serie
#1076
Author: iarenaza
Date: Fri, 05 May 2006 09:23
26 lines
2165 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "Eismann" == Eismann  <g.eismann@gmail.com> writes:

    Eismann> para escribir uso write(fd, "mensaje\x01A", 8), por
    Eismann> ejemplo.

�No tienes que enviar un '\r' al final de cada cadena que le envias al
modem? Por otra parte, recuerda que write puede no escribir todo lo
que le envias (comprueba lo que te devuelve) y que puede que tengas
que enviar las partes restantes en sucesivos envios.

Saludos. I�aki.

- -- 
  Get PGP/GPG Keys at  http://www.escomposlinux.org/iarenaza/pgpkey.php
  I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/>

iD8DBQFEWxmYZXLnGT1HLgcRArjSAJ92ol0R9JE8GBHk3UdapLUVA3y7ewCfSDyd
0n+WToit+YPYNasKWd2eBKk=
=tid8
-----END PGP SIGNATURE-----
Re: Enviar ctrl-z por el puerto serie
#1077
Author: Eismann
Date: Fri, 05 May 2006 10:31
21 lines
2312 bytes
El '\r' es al final de cada orden AT. En este caso es para indicar que
se ha acabado el mensaje que se está escribiendo. En mi ordenador lo
hago sin el '\r' y funciona, aunque no te creas que no lo he probado
también con '\r'...

El write me devuelve un 1, así que sí que lo ha escrito... otra cosa es
que lo haya leido el modem.

El problema que tengo, es que en el ordenador, con un kernel 2.6, me
funciona, y cuando lo paso a uClinux, que tiene un kernel 2.4 y usa
otras librerias (uC-libc), pues no me manda el caracter (o eso es lo
que creo).

Y que no sé por dónde buscar para ver que pasa. Porque si me tengo que
leer el código de las librerias, o del modulo que corresponda, pues me
lo leo, pero quería confirmar que lo estoy haciendo bien y el problema
va por otro sitio para no trabajar a lo tonto.

 Saludos,
 Eismann.
Re: Enviar ctrl-z por el puerto serie
#1078
Author: iarenaza
Date: Fri, 05 May 2006 11:16
24 lines
2178 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "Eismann" == Eismann  <g.eismann@gmail.com> writes:

    Eismann> Y que no s� por d�nde buscar para ver que pasa.

Pincha un equipo con dos interfaces series en medio entre el ordenador
que envia y el aparato embebido y usa algo como snooper para ver si el
trafico se envia o no, y la respuesta que envia el aparato embebido.

Saludos. I�aki.

- -- 
  Get PGP/GPG Keys at  http://www.escomposlinux.org/iarenaza/pgpkey.php
  I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/>

iD8DBQFEWzQEZXLnGT1HLgcRAtrHAJ0bJS7EhVN4qtr7fCtVC1iBtYdERgCfX5Dy
tkcB2pD40wW6j+KH8T5t850=
=sYuA
-----END PGP SIGNATURE-----
Re: Enviar ctrl-z por el puerto serie
#1079
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Fri, 05 May 2006 12:54
12 lines
1787 bytes
Hola "Eismann" <g.eismann@gmail.com>
el 5 May 2006 03:31:01 -0700 escribiste:

> El write me devuelve un 1, as_ que s_ que lo ha escrito... otra cosa es
> que lo haya leido el modem.

write devuelve el número de bytes escritos. Si devuelve 1 es que sólo
ha escrito el primer byte

-- 
Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es>
PGP key 2861C704 --- F206 5671 6789 425D 111C  1302 214F 1934 2861 C704
Re: Enviar ctrl-z por el puerto serie
#1080
Author: Eismann
Date: Fri, 05 May 2006 13:50
8 lines
1750 bytes
Oops. Se me olvido decir que hacia el write solo con el caracter
ctrl-z. O sea, que esta bien: escribo un caracter, y me devuelve un 1.

Voy a probar con el snooper ese, que no lo conocia, a ver si esta
mandando algo.

 Gracias,
 Eismann.
Re: Enviar ctrl-z por el puerto serie
#1083
Author: Eismann
Date: Mon, 08 May 2006 07:07
17 lines
2235 bytes
Esto es de traca. jajaja.

Si enchufo el cacharrito embebido al ordenador y el ordenador al modem
con el snooper en medio, veo que si está mandando el caratcer ctrl-z.
Pero no solo eso. Encima es que el cabron del modem va y contesta (cosa
previsible).

Vamos, que con el snooper funciona todo correctamente, pero si enchufo
el modem directamente no. Ya no se que pensar. Como no sean los cables,
que para la conexion directa le tengo que poner un null-modem... Porque
es lo unico que cambia, pero no le veo la logica a ese razonamiento
(¿por que se iba a comer el null-modem los ctrl-z?).

Si a alguien se le ocurre que puede estar pasando...

  Gracias,
  Eismann.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads