Comunicación Serial Rx problem (RS232)

  • 3 Respuestas
  • 286 Vistas

JuanS

  • Novato
  • *
  • Mensajes: 13
Comunicación Serial Rx problem (RS232)
« : septiembre 18, 2017, 21:33:39 pm »
hola
Tengo problemas con el siguiente codigo, no recibe nada el PLC cuando envio desde el host ( putty)

Cualquier ayuda es bienvenida!!


new RxByte
PlcMain()
{

   
  // Inicializar puerto serie, 9600 bps, 8N1.
  SerialInit(9600)
 
 
  // Ciclo principal del programa.
  while(1)
  {
     // Obtener todos los bytes del buffer del puerto serie.
     RxByte = SerialGetByte()
     SerialSendByte(RxByte)

  }
}

GRACIAS
JuanS
« Última Modificación: septiembre 19, 2017, 10:46:40 am por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1922
  • Soporte Técnico
Re:Comunicación Serial Rx problem (RS232)
« Respuesta #1 : septiembre 19, 2017, 10:45:55 am »
Buenos días,

La función SerialGetByte() retorna "-1" si no hay datos en el buffer de recepción, por lo tanto, estarías enviando constantemente datos incorrectos con SerialSendByte() en el código que pasas. Ver manual STX80XX-MP-PLC-AX_CX_DX.pdf, pág. 196.

Por otro lado, como lo pones adentro de un "loop", se llama constantemente a SerialSendByte() más rápido de lo que la velocidad del puerto serie puede transmitir, por lo tanto se sobreescribe el buffer de salida, antes de que los bytes puedan transmitirse.

Proba el siguiente código:

Código: (Pawn) [Seleccionar]

// Variable para almacenar bytes recibidos.
new RxByte

 // Inicializar puerto serie, 9600 bps, 8N1.
 SerialInit(9600)

 // Loop principal del programa.
 while(1)
 {
    // Comprobar si hay datos recibidos en el puerto serie, obtener byte.
    if((RxByte = SerialGetByte()) != -1)
    {
       // Enviar byte recibido.
       SerialSendByte(RxByte)
       
       // Conmutar led DEBUG.
       LedToggle()
    }
 }

También otra forma es utilizando un evento, que solo se llame al evento de recepción si hay bytes pendientes, independiente del programa principal:

Código: (Pawn) [Seleccionar]

// Variable para almacenar byte recibido.
new RxByte

PlcMain()
{
   // Inicializar puerto serie, 9600 bps, 8N1.
   SerialInit(9600)

   // Crear evento Serial Rx Event para cada byte recibido
   SerialRxSetEvent(1)

   // Loop principal del programa.
   while(1)
   {
      // Solo crear un retardo de 250 mS
      // Se puede hacer cualquier otra lógica aquí adentro.
      DelayMS(250)
      LedToggle()
   }
}

// ***************************************************************************
// OnSerialRx(): Esta función se llama cuando ocurre el evento OnSerialRx al recibir bytes
// ***************************************************************************

@OnSerialRx()
{
   // Obtener todos los bytes recibidos del buffer
   // Solo salir cuando se lean todos los bytes en buffer.
   while((RxByte = SerialGetByte()) != -1)
   {
      // Enviar el byte recibido de vuelta al puerto serie, salida.
      SerialSendByte(RxByte)
   }
}

La ventaja de los eventos, es que no ocupas el programa principal en verificar si llegaron bytes, lo manejas en el momento en que llegan.

Quedamos a disposición.
« Última Modificación: septiembre 19, 2017, 10:49:27 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Atención: Desde el 1 de enero al 25 de enero de 2019, cerramos por vacaciones.
Tenga en cuenta para sus pedidos y/o consultas.

JuanS

  • Novato
  • *
  • Mensajes: 13
Re:Comunicación Serial Rx problem (RS232)
« Respuesta #2 : octubre 18, 2017, 14:37:23 pm »
Hola
Gracias !!
Resuelto ese problema pero...

Ahora tengo otro ,  envio un string desde el host al PLC y el PLC lo recibe aparentemente
y responde con una linea

SerialSendByte( ' 1 ' )     el problema es que en el host no recibo el     ' 1 '    sino algo asi como una g o ACK

Que tipo de codificacion uso para operar con caracteres ?

Aclaro que utilice al menos tres tipos de terminales en el host incluido el putty  y no logro ver lo que estoy haciendo mal...

Espero sus respuestas

Buena jornada !




Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1922
  • Soporte Técnico
Re:Comunicación Serial Rx problem (RS232)
« Respuesta #3 : octubre 18, 2017, 19:27:51 pm »
Ahora tengo otro ,  envio un string desde el host al PLC y el PLC lo recibe aparentemente
y responde con una linea

SerialSendByte( ' 1 ' )     el problema es que en el host no recibo el     ' 1 '    sino algo asi como una g o ACK

Que tipo de codificacion uso para operar con caracteres ?

Buenas tardes, esta bien, corrobora que uses el carácter comillas simples 'x', sin dejar espacios.

Ademas comprobá que los parámetros del puerto serie sean los mismos entre Host y PLC.

Obviamente, usar un cable cruzado entre PLC y Host.

Te adjunto un ejemplo simple para que pruebes, transmite el carácter "1" cada 0.5 segundos, podes probarlo en PuTTY.

Lo acabo de probar con PuTTY y funciona correctamente.

Código: (Pawn) [Seleccionar]
PlcMain()
{
   // Initialize Serial Port, 9600 bps, 8N1.
   if(SerialInit(9600) < 0)
   {
      while(1)
      {
         // Error.
      }
   }

   // Program Main Loop.
   while(1)
   {
      // Delay program for 500 ms.
      DelayMS(500)
      LedToggle()
     
      // Transmit "1" character.
      SerialSendByte('1')
   }
}

Si te sigue sin funcionar, es probable que tengas algun problema con el driver del puerto serie en Windows, muchas veces, si usas un adaptador USB, es conveniente desenchufarlo y volverlo a enchufar (algunos ruidos pueden desconfigurarlo). Cerrar programa terminal y volverlo a abrir.

También verificar que no haya conflicto en el driver o probar unir Tx / Rx del cable, y hacer una prueba tipo loop.

Quedamos a disposición.

Saludos
« Última Modificación: octubre 18, 2017, 19:29:59 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Atención: Desde el 1 de enero al 25 de enero de 2019, cerramos por vacaciones.
Tenga en cuenta para sus pedidos y/o consultas.