none
Saber cuando ha finalizado la transmision de datos del puerto serie RRS feed

  • Pregunta

  • Buenas, mi problema es el siguiente:

     

    Necesito enviar una trama de bytes con diferente paridad. Envio trozos de la cadena y cambio la paridad on the fly, pero lo que sucede es que

    la paridad se cambia a medio enviar datos y de los que deben tener una determinada paridad, no todos la tienen.

     

    Pues lo que yo necesito es una forma de asegurareme que los datos que estan en el buffer de saida del puerto serie se han enviado, entonces cambiar la paridad y enviar otro trozo de la trama, esperar que se hayan enviado todos, y volver a cambiar la paridad para enviar nuevos datos.

     

    Poniendo retardos de tiempo funciona pero creo que es un error y una forma de trabajar poco adecuada.

    Tambien he intentado esperar con un bucle como este, pero sucede exactamente lo mismo.

    while (puertoSerie.BytesToWrite > 0) ;

     

    Cual es la manera correcta para esperar que los datos del puerto serie hayan salido por completo ?

    Gracias de antemano.

    martes, 11 de octubre de 2011 15:37

Todas las respuestas

  • En un PC eso está difícil de hacer (y más desde .NET), si no imposible porque no controlas la UART directamente. Hasta donde yo sé no hay un método para vaciar el buffer, y en el PC las UART son asíncronas por lo que nunca sabrás en qué estado están.

    De todos modos puedes probar a cerrar, configurar y abrir de nuevo el puerto, pero no te garantizo nada.

    Este tipo de control no creo que sea posible desde un PC sin hacer un driver específico para eso.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    miércoles, 19 de octubre de 2011 14:54
  • Hola a Todos,

    A mi forma de ver, si estas utilizando el mandato : SerialPort1.Write("Lo que sea") y ademas lo estas ejecutando en una aplicacion de escritorio,se entiende que la ejecucion no continuara hasta que finalize el envio de los bytes. Por lo tanto, en teoria si no estas ejecutando hilos, el 'BytesToWrite' lo encontraras siempre a cero.

    Puedes comprobarlo simplemente ejecutando lo siguiente :

    SerialPort1.Write("Enviar alguna cosa.......")
    MessageBox.Show(SerialPort1.BytesToWrite.ToString())

    Saludos,
    PepLluis,


    MVP - Visual Developer
    jueves, 3 de noviembre de 2011 0:25
    Moderador
  • Una puntualizaicón a eso que comentas. Depende del driver de la UART que tengas, si tiene buffer interno o no, y también los chips suelen tener un buffer de cuatro bytes o así. Lo que debe estar pasándote es que el .NET es tan lento respecto al envío de los bytes que, en el caso de que el envío sea síncrono (cosa que dudo, aunque no estoy completamente seguro), que cuando llega a la siguiente instrucción, ya ha salido todo.

    La prueba de fuego sería enviar 100K o así de datos en un write, y ver si se cuelga el sistema o si vuelve inmediatamente...


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 4 de noviembre de 2011 13:45
  • Hola a todos,

    Tanto ReadLine como WriteLine, realizan llamadas síncronas por lo que la función que las contiene no continua su ejecución hasta que finaliza la operacion.

    De todas formas esa es la teoría :-) Estoy de acuerdo que faltaría realizar la prueba de fuego.

    Saludos,
    PepLluis,


    MVP - Visual Developer
    domingo, 6 de noviembre de 2011 18:51
    Moderador