Autor Tema: ayuda lenguaje comunicacion rs232 - pic  (Leído 2024 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
ayuda lenguaje comunicacion rs232 - pic
« en: 29 de Diciembre de 2014, 05:08:58 »
Hola amigos,

Dispongo de un dispositivo con pic que se comunica por un conversor serie-uart al software del pc.

Como quería cambiar el software, he usado un espia de puerto serie para ver la comunicación que usa. Uso el Eltima serial port monitor.
El software, lo unico que hace es ajustar los parámetros de transmisión y hace unos calculos y envia datos al pc, una vez acabado cierra y listo.

El caso es que intento simular la comunicación y no consigo nada. No se si es que no se configurar el puerto o el texto de control de envio no es correcto porque no me dice nada el pic.

A ver  si alguno me puedo echar una mano con la configuracion del puerto y el valor que debo usar para comunicarme.

En principio yo pensé de baud rate 19200, sin paridad, 8 bits, 0, flujo ninguno.
Para ver si hay dispositvo usa cdd1, y deberia responder add1. Con cdd3 deberia empezar a mandar las lecturas. Finalmente cdd5 cierra el puerto.
Quizás no debo mandar esos valores... no domino mucho ésto.
Gracias.

Aqui os dejo la parte de la captura:

1 IRP_MJ_CREATE - Opens a COM port
    STATUS_SUCCESS
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
3 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_QUEUE_SIZE - Request sets the size of the internal receive buffer
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
5 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_BAUD_RATE - Returns the baud rate that is currently set for a COM port
            BaudRate - 19200
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
7 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port
            StopBits   - 0
            Parity     - 0
            WordLength - 8
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
9 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_CHARS - Request returns the special characters that Serial uses with handshake flow control
            EofChar   - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 48
            XonChar   - 48
            XoffChar  - 48
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
11 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_HANDFLOW - Request returns information about the configuration of the handshake flow control set for a COM port
            ControlHandShake - 0
            FlowReplace      - 0x00000000
            XonLimit         - 2048
            XoffLimit        - 512
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
13 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_BAUD_RATE - Request sets the baud rate on a COM port. Serial verifies the specified baud rate
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
15 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_CLR_RTS - Request clears the RTS control signal 
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
17 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_CLR_DTR - Request clears the DTR control signal. 
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
19 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_LINE_CONTROL - Request sets the line control register
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
21 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_CHARS - Request sets the special characters that Serial uses for handshake flow control
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
23 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_HANDFLOW - Request sets the configuration of handshake flow control
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
25 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_TIMEOUTS - Request sets the timeout value's that the driver uses with read and write requests
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
27 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_WAIT_MASK - Request configures Serial to notify a client after the occurrence of any one of a specified set of wait events
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
29 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_MODEMSTATUS - Request updates the modem status, and returns the value of the modem status register before the update
            BaudRate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
31 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_MODEMSTATUS - Request updates the modem status, and returns the value of the modem status register before the update
            BaudRate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
33 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_MODEMSTATUS - Request updates the modem status, and returns the value of the modem status register before the update
            BaudRate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
36 IRP_MJ_WRITE - Request transfers data from a client to a COM port
    STATUS_SUCCESS
            cd d1                                             ÍÑ               
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
37 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_WAIT_ON_MASK - Request is used to wait for the occurrence of any wait event specified by using an IOCTL_SERIAL_SET_WAIT_MASK request
            Mask - 0x00000001 (EV_RXCHAR)
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
39 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
            Errors           - 0
            HoldReasons      - 0
            AmountInInQueue  - 2
            AmountInOutQueue - 0
            EofReceived      - 0
            WaitForImmediate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
41 IRP_MJ_READ - Transfers data from a COM port to a client
    STATUS_SUCCESS
            ad d1                                             ­Ñ               
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
43 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
            Errors           - 0
            HoldReasons      - 0
            AmountInInQueue  - 0
            AmountInOutQueue - 0
            EofReceived      - 0
            WaitForImmediate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
45 IRP_MJ_WRITE - Request transfers data from a client to a COM port
    STATUS_SUCCESS
            cd d1                                             ÍÑ               
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
47 IRP_MJ_WRITE - Request transfers data from a client to a COM port
    STATUS_SUCCESS
            cd d3                                             ÍÓ               
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
49 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_WAIT_ON_MASK - Request is used to wait for the occurrence of any wait event specified by using an IOCTL_SERIAL_SET_WAIT_MASK request
            Mask - 0x00000001 (EV_RXCHAR)
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
51 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
            Errors           - 0
            HoldReasons      - 0
            AmountInInQueue  - 2
            AmountInOutQueue - 0
            EofReceived      - 0
            WaitForImmediate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
53 IRP_MJ_READ - Transfers data from a COM port to a client
    STATUS_SUCCESS
            ad d3                                             ­Ó               
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
55 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
            Errors           - 0
            HoldReasons      - 0
            AmountInInQueue  - 0
            AmountInOutQueue - 0
            EofReceived      - 0
            WaitForImmediate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
57 IRP_MJ_WRITE - Request transfers data from a client to a COM port
    STATUS_SUCCESS
            cd d3                                             ÍÓ               
----------------------------------------------------------------------------------
[04/12/2014 11:04:54]
59 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_WAIT_ON_MASK - Request is used to wait for the occurrence of any wait event specified by using an IOCTL_SERIAL_SET_WAIT_MASK request
            Mask - 0x00000001 (EV_RXCHAR)
----------------------------------------------------------------------------------
[04/12/2014 11:04:55]
61 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
            Errors           - 0
            HoldReasons      - 0
            AmountInInQueue  - 2
            AmountInOutQueue - 0
            EofReceived      - 0
            WaitForImmediate - 0
----------------------------------------------------------------------------------
[04/12/2014 11:04:55]
63 IRP_MJ_READ - Transfers data from a COM port to a client
    STATUS_SUCCESS
            00 00                                             ..               
----------------------------------------------------------------------------------

....
....
....

----------------------------------------------------------------------------------
[04/12/2014 11:09:22]
130782 IRP_MJ_WRITE - Request transfers data from a client to a COM port
    STATUS_SUCCESS
            cd d5                                             ÍÕ               
----------------------------------------------------------------------------------
[04/12/2014 11:09:22]
130784 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_PURGE - Request cancels the specified requests and deletes data from the specified buffers
----------------------------------------------------------------------------------
[04/12/2014 11:09:22]
130786 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_WAIT_ON_MASK - Request is used to wait for the occurrence of any wait event specified by using an IOCTL_SERIAL_SET_WAIT_MASK request
            Mask - 0x00000000 
----------------------------------------------------------------------------------
[04/12/2014 11:09:22]
130787 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_WAIT_MASK - Request configures Serial to notify a client after the occurrence of any one of a specified set of wait events
----------------------------------------------------------------------------------
[04/12/2014 11:09:22]
130789 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_PURGE - Request cancels the specified requests and deletes data from the specified buffers
----------------------------------------------------------------------------------
[04/12/2014 11:09:22]
130791 IRP_MJ_CLOSE - Close a COM port
    STATUS_SUCCESS
----------------------------------------------------------------------------------

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #1 en: 30 de Diciembre de 2014, 04:25:01 »
Nadie me puede ayudar?.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7802
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #2 en: 30 de Diciembre de 2014, 11:12:54 »
Por lo que entiendo es algo asi:

PC manda:  0xCD D1
PIC responde:   0xAD D1
PC manda:  0xCD D1
PC manda:  0xCD D3
PIC responde:  ­ 0xAD D3
PC manda:  0xCD D3
PIC responde:  ­ 0x00 00
PC manda:  0xCD D5

Una cosa que me llamo la atencion que lo del micro siempre comienza con 0xAD Dx y la PC 0xCD Dx , excepto por la ultima seccion que le PIC manda 2 bytes y luego se termina la comunicacion. Si no lo primero parece que le responde con lo mismo que le da la PC

Creo que lo mejor es si pudieras ver varias de estas y si se comporta igual. O que varia para que puedas ver la diferencia.

Pero si, es basicamente eso, 19200 bps , 8 bits, sin paridad y 1 bit de stop sin flow control por software ni por hw me imagino.

Citar
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port
            StopBits   - 0
            Parity     - 0
            WordLength - 8

La info fue sacada de aca:
http://msdn.microsoft.com/en-us/library/windows/hardware/jj680686(v=vs.85).aspx
https://github.com/msysgit/msysgit/blob/master/mingw/include/ddk/ntddser.h

Donde
Citar
#define STOP_BIT_1                        0x00

No hay mucho mas para ver o determinar con una sola muestra como te dije, de aqui depende de vos conseguir mas y ver que sea exactamente asi y tratar de determinar cuando/por que envia eso/que significa/etc.

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #3 en: 30 de Diciembre de 2014, 14:29:20 »
Hola,
Gracias por la respuesta.

Si, tengo muchos archivos sacados de como funciona.

PC manda:  0xCD D1
PIC responde:   0xAD D1
PC manda:  0xCD D1
PC manda:  0xCD D3
PIC responde:  ­ 0xAD D3
PC manda:  0xCD D3
PIC responde:  ­ 0x00 00
PC manda:  0xCD D5

Siempre es asi, el segundo cd d3, es cuando ya empieza a mandar todos los datos. Yo corté el ejemplo el 00 00, que viste es el primer dato pero envia 256 x 32 =8192, cuando están todos, el pc hace un calculo con los datos y le envia cerrar el puerto con cd d5.
Lo que no logro es simular la comunicacion.

Si uso un terminal y envio cd d1, no responde... ni cd d3 nada. no responde nada el pic, ni mide ni envia ni nada, es como si el dato que envio no fuera el correcto.

Alguna idea de que puedo hacer?.
Muchas gracias por el interes, pero es que ya no se que hacer.
Gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7802
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #4 en: 30 de Diciembre de 2014, 18:15:04 »
En el terminal tenes que usar:

ÍÑ y no 0xCD 0xD1. Espero que no sea ese el error.

Tambien puede ser que al ingresarlo en el terminal no respondas tan rapido y el pic tenga su propio timer para detectar la "ausencia" de la PC. Pero aun asi deberia de responderte aunque sea los primeros bytes.

Lo que no entiendo mucho es como llega a 0xCD = Í
Usando una calculadora online me da el mismo resultado al pasarlo de hex a ASCII (es decir ÍÑ)
http://www.rapidtables.com/convert/number/hex-to-ascii.htm

pero luego veo tablas ASCII extendidas y es otro caracter.



Pero deberia andar con ese valor ÍÑ xD
« Última modificación: 30 de Diciembre de 2014, 18:32:33 por KILLERJC »

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #5 en: 30 de Diciembre de 2014, 19:52:11 »
Hola José:

Segun entiendo podes (o estas) comunicando el PIC con la PC (estas recibiendo datos validos), es decir que esta bien configurada la comunicacion en la PC. Si podes ver los parametros del programa ahí vas a encontrar los valores que necesitas ( cantidad de bits a transimitir , si tiene paridad o no, cuantos bit de stop, si esta habilitado el control de flujo por software, etc).
Otra forma es ver, si es que lo tenes, el manual del software o del hardware que tiene el PIC. Ahí, deberia, estar la configuracion de la transmision serie.
Antes de realizar la prueba con el Hyperterminal, fijate como es la coneccion del cable serie, si es directo o tipo null-modem (cruzado) y si tiene algun puente (control de flujo por hardware).
Si seguis con problemas volve a escribir.
Saludos



Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #6 en: 30 de Diciembre de 2014, 23:22:15 »
En el terminal tenes que usar:

ÍÑ y no 0xCD 0xD1. Espero que no sea ese el error.

Tambien puede ser que al ingresarlo en el terminal no respondas tan rapido y el pic tenga su propio timer para detectar la "ausencia" de la PC. Pero aun asi deberia de responderte aunque sea los primeros bytes.

Lo que no entiendo mucho es como llega a 0xCD = Í
Usando una calculadora online me da el mismo resultado al pasarlo de hex a ASCII (es decir ÍÑ)

pero luego veo tablas ASCII extendidas y es otro caracter.


Pero deberia andar con ese valor ÍÑ xD

Hola.
Es que lo esta representando en Unicode que es el formato de caracteres que normalmente utiliza Windows.


De todas formas lo que interesa es el valor en hexadecimal, la representacion es una ventaja que te da el software y esta representacion no siempre tiene que ver con la realidad, como cuando representa un caracter de control (bel, lf, cr, etc, etc).

Saludos.
« Última modificación: 30 de Diciembre de 2014, 23:25:29 por Darkman_A »

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #7 en: 31 de Diciembre de 2014, 00:00:29 »
Hola,

Me parece que el que comienza la tranferencia es el PIC

----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
36 IRP_MJ_WRITE - Request transfers data from a client to a COM port
    STATUS_SUCCESS
            cd d1                                             ÍÑ               
----------------------------------------------------------------------------------

y el que le responde es el COM

----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
41 IRP_MJ_READ - Transfers data from a COM port to a client
    STATUS_SUCCESS
            ad d1                                             ­Ñ               
----------------------------------------------------------------------------------

Por lo tanto quien comienza la transferencia es el dispositivo con el PIC y no la PC.

Saludos.
« Última modificación: 31 de Diciembre de 2014, 00:10:28 por Darkman_A »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7802
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #8 en: 31 de Diciembre de 2014, 01:45:04 »
Citar
De todas formas lo que interesa es el valor en hexadecimal, la representacion es una ventaja que te da el software y esta representacion no siempre tiene que ver con la realidad, como cuando representa un caracter de control (bel, lf, cr, etc, etc).

Es asi, pero si usas el hyperterminal imagino que poner CD D1 es mandar las letras "C","D"," ","D","1" y no su valor hexadecimal, por eso la importancia que le di. A no ser que use Alt+205 (═) y Alt+209 (Ð) cuando escriba en la terminal.
Lo que si no sabia era el unicode.

Citar
Me parece que el que comienza la tranferencia es el PIC

SI yo tambien pense en eso al principio.. leyendo esta parte: Request transfers data from a client to a COM port , Creyendo que el cliente era el PIC, pero no es el PIC es el programa el cliente.

Las pruebas son las siguientes:

Si te fijas usa IRP_MJ_WRITE del driver de MS, el cliente ( programa ) pide al driver que trasfiera esos datos por el COM

Ademas tambien podes ver que pide un IOCTL_SERIAL_GET_COMMSTATU donde figura 2 bytes en cola de entrada

            AmountInInQueue  - 2
            AmountInOutQueue - 0

Y procede con una lectura IRP_MJ_READ
« Última modificación: 31 de Diciembre de 2014, 04:52:05 por KILLERJC »

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #9 en: 31 de Diciembre de 2014, 06:08:03 »
Hola,
Gracias por el interes a ambos.

Bien como ya comenté es un dispositivo que no tengo el archivo del pic en ensamblador para chequear. Solo puedo espiar el puerto serie para ver lo que envia desde el software para ver la comunicación.

Si, los valores son en unicode. Pero con un terminal se puede enviar tanto en ascii como hex o lo que quieras. El problema no es ese, es que esos valores no son los correctos.

No se si habeis pasado por alto que estoy usando un conversor serial - usb FTDI, quizás pueda variar los simbolos de comunicacion???.

Les dejo otro ejemplo con otro programa espia, aqui se ve más claro que es TX y que RX.
El software solo le envia un valor y el pic responde, luego le envia otro y ya el pic se pone a medir y enviar, cuando esta todo enviado y calculado por el software se cierra el puerto desde el software.
El software solo le dice, configurate asi, mide y envia y cierrate.

<20141231092104.503 SYS>
COM está abierto
<20141231092104.503 SYS>
Tamaño de la cola in/out 2048/2048
<20141231092104.503 SYS>
Baud rate 19200
<20141231092104.503 SYS>
RTS off
<20141231092104.503 SYS>
DTR desactivado
<20141231092104.513 SYS>
Bits de datos=8, Bits de stop=1, Paridad=None
<20141231092104.513 SYS>
Configurar carácteres: Eof=0x60, Error=0x00, Break=0x00, Event=0x30, Xon=0x30, Xoff=0x30
<20141231092104.523 SYS>
Handflow: ControlHandShake=(), FlowReplace=(), XonLimit=512, XoffLimit=512
<20141231092104.523 SYS>
Configurar tiempos de espera: ReadInterval=-1, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=100, WriteTotalTimeoutConstant=1000
<20141231092104.523 TX>
ÍÑ
<20141231092104.523 RX>
­Ñ
<20141231092104.523 TX>
ÍÑÍÓ
<20141231092104.573 RX>
­Ó
<20141231092104.573 TX>
ÍÓ
<20141231092106.475 RX>
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ AQUI ENVIA TODOS LOS DATOS EN HEX AL PC
<20141231092126.514 TX>
ÍÕ
<20141231092126.514 SYS>
Purgar el puerto serie: RXABORT, TXABORT
<20141231092126.514 SYS>
Purgar el puerto serie: RXCLEAR, TXCLEAR
<20141231092126.514 SYS>
COM está cerrado

Como pueden ver es lo mismo. No se si el conversor afecta en algo a los datos enviados. Tambien se ve más claramente la configuracion del puerto serie en este programa.

En hex

 0x00000 43 4F 4D 20 65 73 74 E1 20 61 62 69 65 72 74 6F  COM está abierto
 0x00010 20 54 61 6D 61 F1 6F 20 64 65 20 6C 61 20 63 6F   Tamańo de la co
 0x00020 6C 61 20 69 6E 2F 6F 75 74 20 32 30 34 38 2F 32  la in/out 2048/2
 0x00030 30 34 38 20 42 61 75 64 20 72 61 74 65 20 31 39  048 Baud rate 19
 0x00040 32 30 30 20 52 54 53 20 6F 66 66 20 44 54 52 20  200 RTS off DTR 
 0x00050 64 65 73 61 63 74 69 76 61 64 6F 20 42 69 74 73  desactivado Bits
 0x00060 20 64 65 20 64 61 74 6F 73 3D 38 2C 20 42 69 74   de datos=8, Bit
 0x00070 73 20 64 65 20 73 74 6F 70 3D 31 2C 20 50 61 72  s de stop=1, Par
 0x00080 69 64 61 64 3D 4E 6F 6E 65 20 43 6F 6E 66 69 67  idad=None Config
 0x00090 75 72 61 72 20 63 61 72 E1 63 74 65 72 65 73 3A  urar carácteres:
 0x000A0 20 45 6F 66 3D 30 78 36 30 2C 20 45 72 72 6F 72   Eof=0x60, Error
 0x000B0 3D 30 78 30 30 2C 20 42 72 65 61 6B 3D 30 78 30  =0x00, Break=0x0
 0x000C0 30 2C 20 45 76 65 6E 74 3D 30 78 33 30 2C 20 58  0, Event=0x30, X
 0x000D0 6F 6E 3D 30 78 33 30 2C 20 58 6F 66 66 3D 30 78  on=0x30, Xoff=0x
 0x000E0 33 30 20 48 61 6E 64 66 6C 6F 77 3A 20 43 6F 6E  30 Handflow: Con
 0x000F0 74 72 6F 6C 48 61 6E 64 53 68 61 6B 65 3D 28 29  trolHandShake=()
 0x00100 2C 20 46 6C 6F 77 52 65 70 6C 61 63 65 3D 28 29  , FlowReplace=()
 0x00110 2C 20 58 6F 6E 4C 69 6D 69 74 3D 35 31 32 2C 20  , XonLimit=512, 
 0x00120 58 6F 66 66 4C 69 6D 69 74 3D 35 31 32 20 43 6F  XoffLimit=512 Co
 0x00130 6E 66 69 67 75 72 61 72 20 74 69 65 6D 70 6F 73  nfigurar tiempos
 0x00140 20 64 65 20 65 73 70 65 72 61 3A 20 52 65 61 64   de espera: Read
 0x00150 49 6E 74 65 72 76 61 6C 3D 2D 31 2C 20 52 65 61  Interval=-1, Rea
 0x00160 64 54 6F 74 61 6C 54 69 6D 65 6F 75 74 4D 75 6C  dTotalTimeoutMul
 0x00170 74 69 70 6C 69 65 72 3D 30 2C 20 52 65 61 64 54  tiplier=0, ReadT
 0x00180 6F 74 61 6C 54 69 6D 65 6F 75 74 43 6F 6E 73 74  otalTimeoutConst
 0x00190 61 6E 74 3D 30 2C 20 57 72 69 74 65 54 6F 74 61  ant=0, WriteTota
 0x001A0 6C 54 69 6D 65 6F 75 74 4D 75 6C 74 69 70 6C 69  lTimeoutMultipli
 0x001B0 65 72 3D 31 30 30 2C 20 57 72 69 74 65 54 6F 74  er=100, WriteTot
 0x001C0 61 6C 54 69 6D 65 6F 75 74 43 6F 6E 73 74 61 6E  alTimeoutConstan
 0x001D0 74 3D 31 30 30 30 20 CD D1 AD D1 CD D1 CD D3 AD  t=1000 ÍŃ­ŃÍŃÍÓ­
 0x001E0 D3 CD D3 00 00 83 02 82 02 82 02 82 02 83 02 83  ÓÍÓ..ƒ.‚.‚.‚.ƒ.ƒ
 0x001F0 02 82 02 82 02 80 02 81 02 81 02 82 02 80 02 81  .‚.‚.€...‚.€.
 0x160E0 69 6D 69 74 CD D5 50 75 72 67 61 72 20 65 6C 20  imitÍŐPurgar el 
 0x160F0 70 75 65 72 74 6F 20 73 65 72 69 65 3A 20 52 58  puerto serie: RX
 0x16100 41 42 4F 52 54 2C 20 54 58 41 42 4F 52 54 20 50  ABORT, TXABORT P
 0x16110 75 72 67 61 72 20 65 6C 20 70 75 65 72 74 6F 20  urgar el puerto 
 0x16120 73 65 72 69 65 3A 20 52 58 43 4C 45 41 52 2C 20  serie: RXCLEAR, 
 0x16130 54 58 43 4C 45 41 52 20 43 4F 4D 20 65 73 74 E1  TXCLEAR COM está
 0x16140 20 63 65 72 72 61 64 6F 20                        cerrado

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7802
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #10 en: 31 de Diciembre de 2014, 07:05:59 »
Siguen siendo los mismos simbolos,

Lo que no me queda claro ahora que lo nombraste es si lo capturado es sobre el puerto RS-232 o sobre el conversor USB-RS232 , o estas usando este conversor para mandarle datos al PIC?

Si no tambien podrias crearte un programita en python o C para que le envie esos datos por el puerto Serial, si es que crees que es el conversor serial - USB.

Citar
El software solo le dice, configurate asi, mide y envia y cierrate.

Es mas un: Sos vos ? mandame la info, chau.

Pero como se ve no hay control por soft ni nada por el estilo es mandar datos y esperar respuesta, por eso no puedo comprender que este mal los datos. la informacion tiene sentido al menos ?

EDIT:

Mirando la informacion mandada:
Tambien puede ser algo muy tonto pero me imaginaba que podrian estar dados vueltas los numeros

CD D1 por D1 CD

por que estaba viendo los datos 83 02 82 02 82 02 82 02 83 02

Y si fuera algo a medir y varia poco por que varia el primero ?  entonces pense que podria ser al reves la interpretacion 0283 0282 0282 0282 0281 etc
« Última modificación: 31 de Diciembre de 2014, 07:10:10 por KILLERJC »

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #11 en: 31 de Diciembre de 2014, 10:22:35 »
Hola gente !!!.

Citar
De todas formas lo que interesa es el valor en hexadecimal, la representacion es una ventaja que te da el software y esta representacion no siempre tiene que ver con la realidad, como cuando representa un caracter de control (bel, lf, cr, etc, etc).

Es asi, pero si usas el hyperterminal imagino que poner CD D1 es mandar las letras "C","D"," ","D","1" y no su valor hexadecimal, por eso la importancia que le di. A no ser que use Alt+205 (═) y Alt+209 (Ð) cuando escriba en la terminal.
Lo que si no sabia era el unicode.

Si enviara las letras "C","D"," ","D","1" como caracteres estaria recontra mal, en ese caso tendria que enviar los caracteres "ÍÑ" que tambien esta mal, porque siempre hay que enviar los datos en hexadecimal (salvo que sepas que es texto, por ejemplo "hola").
Como Jose ya sabe que puede mandar en hexa por hiperterminal, doy vuelta de hoja con este tema.

Citar
Me parece que el que comienza la tranferencia es el PIC

SI yo tambien pense en eso al principio.. leyendo esta parte: Request transfers data from a client to a COM port , Creyendo que el cliente era el PIC, pero no es el PIC es el programa el cliente.

Las pruebas son las siguientes:

Si te fijas usa IRP_MJ_WRITE del driver de MS, el cliente ( programa ) pide al driver que trasfiera esos datos por el COM

Ademas tambien podes ver que pide un IOCTL_SERIAL_GET_COMMSTATU donde figura 2 bytes en cola de entrada

            AmountInInQueue  - 2
            AmountInOutQueue - 0

Y procede con una lectura IRP_MJ_READ


Esta bien, es como digo. Fijate:

[04/12/2014 11:04:53]
36 IRP_MJ_WRITE - Request transfers data from a client to a COM port
    STATUS_SUCCESS
            cd d1                                             ÍÑ              
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
37 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_WAIT_ON_MASK - Request is used to wait for the occurrence of any wait event specified by using an IOCTL_SERIAL_SET_WAIT_MASK request
            Mask - 0x00000001 (EV_RXCHAR)
----------------------------------------------------------------------------------
[04/12/2014 11:04:53]
39 IRP_MJ_DEVICE_CONTROL - Request operates a serial port
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
            Errors           - 0
            HoldReasons      - 0
            AmountInInQueue  - 2
            AmountInOutQueue - 0
            EofReceived      - 0
            WaitForImmediate - 0
----------------------------------------------------------------------------------------------------------

(saco de lo anterior lo que me interesa analizar)

36 IRP_MJ_WRITE - Request transfers data from a client to a COM port  el PIC le envia a la PC 2 caracters (CD D1)

PIC ----> PC

STATUS_SUCCESS
        IOCTL_SERIAL_GET_COMMSTATUS - Request returns information about the communication status of a COM port
            Errors           - 0
            HoldReasons      - 0
            AmountInInQueue  - 2
            AmountInOutQueue - 0

La PC lo recibe y los tiene que meter en algun lado, ¿donde lo pone? .... en su buffer de entrada (InQueue=2). Esta recibiendo.

Jose, si podes y si te parece bien,  los futuros datos que subas hacelo como adjunto en archivo de texto plano (txt) y si queres zipealo asi no se hace tan largo el post.
Otra cosa, si podes publicar el nombre y modelo del aparato con el pic y el programa o sino pasamelo por privado para buscar mas informacion.
Una vez hice algo parecido con un aparato. Me arme un cable serie y ademas de los 2 conectores DB25 le puse 2 mas para capturar los datos. Estos iban a una PC con 2 puertos (solo usaba  RX en cada interfase) y utilizaba un programa en DOS que mostraba los datos que enviaban la PC y el dispositivo (usaba 2 PC, una conectada al dispositivo y otra para monitorear los datos). Tenia uno que mostraba en pantalla separadas y no se si era el mismo programa o otro que me lo mostraba en una pero con distintos colores lo que enviaba uno u otro dispositivo. Al toque sabias quien empezaba y que enviaba cada uno.
Otra forma de saber quien comienza la transmision es con un tester de RS232. Hay algunos que poseen leds bicolor que te indican quien es DTE y quien DCE.
Cambiaron los tiempos y las pc con 2 seriales han practicamente desaparecido. Se me ocurre armar algo con un PIC que haga los mismo pero que envie los datos a la PC por USB. Lo pongo en la lista de cosas para hacer.

Saludos.
 

« Última modificación: 31 de Diciembre de 2014, 12:32:50 por Darkman_A »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7802
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #12 en: 31 de Diciembre de 2014, 13:57:41 »
Bueno como que ambos tenemos distintos puntos de vista de como es. Yo voy a dar varias razones por las cuales pienso que estas equivocado.

1- El programa en una computadora es quien debe de abrir la escucha de un puerto y cerrarlo, en PIC no hay forma de que sepa cuando se encuentra activo el programa o cuando tiene abierto el puerto, por lo tanto es el programa quien debe comenzar la "conversacion".
Por un ratito supongamos que es el PIC quien inicia la conversacion, cada unos 10 segundos (para que se note lo que quiero remarcaar) mando el mensaje para ver si se encuentra activa mi PC y rogando que sea el programa para ese PIC el que este usando el puerto serie, si no tengo abierto el programa no pasa nada, pero si yo quiero actualizar lo del programa puedo llegar a esperar 10 segundos desde que lo abri hasta que el PIC comienze a escribirme, ademas me estaria escribiendo muchas veces mientras yo no quiero actualizarlo. Por que hacer un programa para un PIC que mande cada X tiempo si puedo hacerlo mas simple y esperar una llegada de un dato.
Por otra parte si fuera la PC la primera no tendrias ningun complejo como el que nombre, abris el programa, el programa exige los datos, termino de usar el port, lo cierra y listo. Lo volvera a abrir solo y solo si cuando le sea necesario. El PIC esperara por una interrupcion en RX mientras sigue haciendo sus cosas, es lo mas logico y sencillo de hacer.

2- Parece que no te das cuenta que hay un IOCTL_SERIAL_GET_COMMSTATUS detras de cada IRP_MJ_READ, segun tu apreciacion solo estas viendo el IRP_MJ_WRITE, pero hay 2 casos que violan tus afirmaciones.

El primer caso es cuando existen 2 writes seguidos y aun asi hay 2 bytes en la cola de entrada.
El segundo caso es cuando "finaliza" la conversacion, Hay un write PERO no hay un IOCTL_SERIAL_GET_COMMSTATUS.

Ademas no es tan dificil de entender, si lo haces sobre la PC, In significa entrada y Out salida de la PC. Tambien tenes que entender que esto no se realiza el debug SOBRE el port, sino que se hace el debug sobre el Driver que posee windows. Es decir pedidos entre el Soft - OS.

3- Con el segundo log que paso esperaba que quede un poco mas claro, estando desde la PC:

<20141231092104.523 TX>
ÍÑ
<20141231092104.523 RX>
Ñ
<20141231092104.523 TX>
ÍÑÍÓ

Si ya con esto no puedo convencerte, entonces habrá que esperar hasta que lo haga funcionar.

Para josearrow

No se si quedo muy tapado pero en mi anterior post nombraba sobre la posibilidad que esten invertidos los datos.
« Última modificación: 31 de Diciembre de 2014, 14:08:06 por KILLERJC »

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #13 en: 31 de Diciembre de 2014, 14:11:36 »
Hola,
Gracias a los dos por vuestro tiempo.
Si, he probado a meterlos al contrario pero nada.
Ahora mismo no puedo probar con un cable de serie normal al aparato, uso un conversor usb porque no estoy en mi casa.
Cuando llegue lo probaré en el pc directo con el cable. Debe ser algo del conversor.

Ya les comentaré, gracias y feliz año 2015.


Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: ayuda lenguaje comunicacion rs232 - pic
« Respuesta #14 en: 31 de Diciembre de 2014, 14:37:35 »
Bueno como que ambos tenemos distintos puntos de vista de como es. Yo voy a dar varias razones por las cuales pienso que estas equivocado.

1- El programa en una computadora es quien debe de abrir la escucha de un puerto y cerrarlo, en PIC no hay forma de que sepa cuando se encuentra activo el programa o cuando tiene abierto el puerto, por lo tanto es el programa quien debe comenzar la "conversacion".
Por un ratito supongamos que es el PIC quien inicia la conversacion, cada unos 10 segundos (para que se note lo que quiero remarcaar) mando el mensaje para ver si se encuentra activa mi PC y rogando que sea el programa para ese PIC el que este usando el puerto serie, si no tengo abierto el programa no pasa nada, pero si yo quiero actualizar lo del programa puedo llegar a esperar 10 segundos desde que lo abri hasta que el PIC comienze a escribirme, ademas me estaria escribiendo muchas veces mientras yo no quiero actualizarlo. Por que hacer un programa para un PIC que mande cada X tiempo si puedo hacerlo mas simple y esperar una llegada de un dato.
Por otra parte si fuera la PC la primera no tendrias ningun complejo como el que nombre, abris el programa, el programa exige los datos, termino de usar el port, lo cierra y listo. Lo volvera a abrir solo y solo si cuando le sea necesario. El PIC esperara por una interrupcion en RX mientras sigue haciendo sus cosas, es lo mas logico y sencillo de hacer.


Hola. Sigo con mi postura  :D
El aparato que analice y que comento que arme los cables mas arriba, hace justo eso que decis que no conviene hacer. Es el que origina la transmision de los datos. Aunque se lo podes setear por tiempo tambien lo hace cuando llena el buffer de datos. Entonces se comunica con la PC, descarga los datos y borra el buffer . Asi de descabellado. Si espero que la PC "me interrogue" como dispositivo para descargar el buffer puedo perder datos.
El PIC puede saber cuando un programa esta activo por medio de handshake.

El punto 2 luego lo miro bien y te lo retruco mas tarde  :D
Voy a estudiar la funcion IRP_MJ_WRITE.


Jose, no creo que sea el conversor.

Nota al margen: estoy sorprendido, fui al "megakilomboquetengo" y encontre los cables de una  :shock: :shock:

Saludos.