none
Comunicación Multiprocesador (Envio de una trama con bytes en diferente paridad) RRS feed

  • Pregunta

  • Buenos dias.

    Mi problema es el siguiente. Necesito enviar una trama a un microocntrolador que utiliza un protocolo multiprocesador. Es decir, debo enviar la siguiente trama de 4 bytes 0x01 , 0x00 , 0x4C('L') , 0xFF pero el primer byte y el ultimo deben ser enviados con paridad MARK y los dos centrales deben ser enviados con paridad SPACE.

    Mi código es el siguiente:

                SerialPort puertoSerie;
               
                puertoSerie = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
                puertoSerie.Open();

                byte[] OutputBuffer;

                OutputBuffer = new byte[4];
                OutputBuffer[0] = 0x01;
                OutputBuffer[1] = 0x00;
                OutputBuffer[2] = Convert.ToByte('L');
                OutputBuffer[3] = 0xFF;

                puertoSerie.Parity = Parity.Mark;
                puertoSerie.Write(OutputBuffer, 0, 1);
                Thread.Sleep(100);

                puertoSerie.Parity = Parity.Space;
                puertoSerie.Write(OutputBuffer, 1, 2);
                Thread.Sleep(100);
               
                puertoSerie.Parity = Parity.Mark;
                puertoSerie.Write(OutputBuffer, 3, 1);
                Thread.Sleep(100);
               
                puertoSerie.Parity = Parity.None;

                while (puertoSerie.BytesToRead < 5)       // El 5 es la longitud del mensaje que esperamos recibir
                {
                    MessageBox.Show(Convert.ToString(puertoSerie.BytesToRead));
                }
               
                byte[] InputBuffer;
                InputBuffer = new byte[5];

                puertoSerie.Read(InputBuffer, 0, 5);

                for (int i = 0; i < 5; i++)
                {
                    MessageBox.Show(String.Format("0x{0:X2}", InputBuffer[i]));
                }

                puertoSerie.Close();

    Lo que sucede ahora es que el microcontrolador recibe los datos de forma correcta, pero si cambio los

    Thread.Sleep(100);

    por

    while (puertoSerie.BytesToWrite > 0) ;

    el microcontrolador ya no recibe los datos con las paridades correctas y por tanto no interpreta el comando de forma correcta. No entiendo porque sucede esto con la segunda opcion si espero a que se envien los datos del buffer para cambiar la paridad y enivar de nuevo.

    Mi pregunta es como puedo enviar una trama variando la paridad sin necesidad de utilizar retardos de tiempo, ya que esto al final siempre acaba dando problemas.

     

    A parte de lo ya comentado, me encuentro con un problema mas grande si cabe. Es el siguiente.

    El microcontrolador tambien envia los datos el modo multiprocesador, es decir, el responde 5 bytes 0x00 , 0x01, 'A' , 'L' , 0xFF. El primero y el ultimo utilizan paridad MARK y los otros tres utilizan paridad SPACE.

    Solo soy capaz de recibir los datos si la paridad del puerto serie es NONE, con cualquier otro tripo de paridad los datos enviados se alteran. Esto lo he comprobado enviando datos desde un PC con una paridad de puerto serie y recibiendo datos en otro PC con una paridad distinta. Solo si la paridad en el PC que recibe es NONE es capaz de recibir los datos enviados con cualquier tipo de paridad de forma correcta.

    Pues bien el problema que tengo es que si el microprocesador tarda en responder, es decir, hago que genere la respuesta 1 segundo despues de recibir el comando, todo funciona de maravilla. El problema es que el microcontrolador debe responder de forma inmediata al recibir el comando, y lo que sucede es que si espero un tiempo en el ultimo envio para poner paridad NONE, recibo unos datos erroneos (debido a que recibo con una paridad diferente a NONE). Si no espero un tiempo para cambiar la paridad y lo hago de forma inmediata, los bytes que se envian no se envian con la paridad correcta.

     

    Necesito ayuda porque estoy totalmente perdido. He probado las mil y unas formas y ninguna funciona de forma correcta.

    No puedo creerme que esto no se pueda conseguir. Principalmente por que es lo que necesito.

     

    Gracias de antemano y espero cualquier ayuda con ansia.

    martes, 11 de octubre de 2011 10:56

Todas las respuestas