예제 #1
0
        public bool Crc_Check(aux_buffer a)
        {
            bool result;

            result = true;
            byte n;
            byte crc_frame;

            crc_frame = 0;
            n         = 1;
            while (n < (a.data_len - 1))
            {
                crc_frame = (byte)(crc_frame ^ a.buffer[n]);
                n++;
            }

            if (crc_frame == a.buffer[n])
            {
                result = true;    // el frame es correcto
            }
            else
            {
                result = false; // Error de frame
            }

            return(result);
        }
예제 #2
0
 private void EnvioFrame(aux_buffer a)
 {
     //PuertoDatos.RtsEnable = Transmision;
     //Thread.Sleep(3); // espera 3 milisegundos antes de enviar un frame
     PuertoDatos.Write(a.buffer, 0, a.data_len);
     //Thread.Sleep(a.data_len + 3); // espera N bytes + 3 milisegundos antes de cambiar a recepcion de datos
     //PuertoDatos.RtsEnable = Recepcion;
     //PuertoDatos.
 }
예제 #3
0
        //

        public aux_buffer SetCommandMaster(byte cmd)
        {
            aux_buffer     Buffer_Enviar   = new aux_buffer();
            ProtocoloRS485 InfoTransmision = new ProtocoloRS485();

            InfoTransmision.data_len     = 0;
            InfoTransmision.buffer_index = 0;
            InfoTransmision.destino      = Dir_slave; // envia una orden a el esclavo
            InfoTransmision.origen       = MASTER_ID; // del la direccion maestro

            switch (cmd)
            {
            case CMD_Read_Status:
                InfoTransmision.command = CMD_Read_Status;
                break;

            case CMD_Deliver_scooter:
                InfoTransmision.command = CMD_Deliver_scooter;
                break;

            case CMD_Receive_scooter:
                InfoTransmision.command = CMD_Receive_scooter;
                break;

            case CMD_Clear_flag_Deliver:
                InfoTransmision.command = CMD_Clear_flag_Deliver;
                break;

            case CMD_Clear_flag_Receive:
                InfoTransmision.command = CMD_Clear_flag_Receive;
                break;

            case CMD_Reset_modulo:
                InfoTransmision.command = CMD_Reset_modulo;
                break;

            default:
                InfoTransmision.command = CMD_ERROR;
                break;
            }

            // si se generar un error, no se genera respuesta
            if (InfoTransmision.command != CMD_ERROR)
            {
                Buffer_Enviar = Built_to_Frame(InfoTransmision);
            }

            return(Buffer_Enviar);
        }
예제 #4
0
        private void BanderaEntregaScooter_Click(object sender, EventArgs e)
        {
            aux_buffer a = new aux_buffer();

            if (PuertoDatos.IsOpen)
            {
                a = DatosMaestro.SetCommandMaster(Clear_flag_Deliver);
                EnvioDatos.AppendText(BitConverter.ToString(a.buffer, 0, a.data_len) + "\r\n");
                EnvioFrame(a);
            }
            else
            {
                MessageBox.Show("Se necesita seleccionar y abrir un puerto");
            }
        }
예제 #5
0
        private void button2_Click(object sender, EventArgs e)
        {
            aux_buffer a = new aux_buffer();

            if (PuertoDatos.IsOpen)
            {
                a = DatosMaestro.SetCommandMaster(Read_Status);
                EnvioDatos.AppendText(BitConverter.ToString(a.buffer, 0, a.data_len) + "\r\n");
                EnvioFrame(a);
            }
            else
            {
                MessageBox.Show("Se necesita seleccionar y abrir un puerto");
            }
        }
예제 #6
0
        private void BanderaEntregaScooter_Click(object sender, EventArgs e)
        {
            aux_buffer a = new aux_buffer();

            if (PuertoDatos.IsOpen)
            {
                a = DatosMaestro.SetCommandMaster(Clear_flag_Deliver);
                EnvioDatos.AppendText(BitConverter.ToString(a.buffer, 0, a.data_len) + "\r\n");
                EnvioFrame(a);
            }
            else
            {
                MessageBox.Show("Se necesita seleccionar y abrir un puerto");
            }
        }
예제 #7
0
        //

        //
        public aux_buffer Built_to_Frame(ProtocoloRS485 b)
        {
            byte       n, m, u;
            aux_buffer c = new aux_buffer();

            c.data_len = 0x00;

            c.buffer[0] = BYTE_START;           //Byte de arranque.
            c.buffer[1] = b.data_len;           //Longitud de datos.
            c.buffer[2] = b.origen;
            c.buffer[3] = b.destino;
            c.buffer[4] = b.command;            //Comando

            //parte de datos
            n = 0;
            while (n < b.data_len)
            {
                c.buffer[n + 5] = b.buffer[n];
                n++;
            }
            c.buffer[b.data_len + 5] = BYTE_STOP;

            //Calcula el Check_Sum
            n = 1;
            m = 0;
            while (n < (b.data_len + 6))
            {
                u = c.buffer[n];
                m = (byte)(m ^ u);
                n++;
            }
            c.buffer[b.data_len + 6] = m;
            c.data_len = (byte)(b.data_len + 6);
            c.data_len++;
            return(c);
        }
예제 #8
0
        private void ScanNewFrame_Tick(object sender, EventArgs e)
        {
            if (FRAME_BUFFER0)
            {
                ProtocoloRS485 a = new ProtocoloRS485();
                a = DatosMaestro.Read_Frame(Buffer_frame_RX0);

                switch (a.command)
                {
                case Read_Status:
                    ReciboDatos.AppendText(BitConverter.ToString(Buffer_frame_RX0.buffer, 0, Buffer_frame_RX0.data_len) + "\r\n");
                    // falta informacion
                    // de estado de la scooter
                    if ((a.buffer[0] & (1 << EQUIPO_DISPONIBLE)) != 0)
                    {
                        ScooterDisponible.Image = ON;
                    }
                    else
                    {
                        ScooterDisponible.Image = OFF;
                    }


                    if ((a.buffer[0] & (1 << ESPACIO_DISPONIBLE)) != 0)
                    {
                        EspacioDisponible.Image = ON;
                    }
                    else
                    {
                        EspacioDisponible.Image = OFF;
                    }


                    if ((a.buffer[0] & (1 << EQUIPO_CONECTADO_ABIERTO)) != 0)
                    {
                        ScooterConectadoAbierto.Image = ON;
                    }
                    else
                    {
                        ScooterConectadoAbierto.Image = OFF;
                    }

                    if ((a.buffer[0] & (1 << EQUIPO_DESCONECTADO_ABIERTO)) != 0)
                    {
                        ScooterDesconectadoAbierto.Image = ON;
                    }
                    else
                    {
                        ScooterDesconectadoAbierto.Image = OFF;
                    }

                    if ((a.buffer[0] & (1 << EQUIPO_DESCONECTADO_ABIERTO)) != 0)
                    {
                        ScooterDesconectadoAbierto.Image = ON;
                    }
                    else
                    {
                        ScooterDesconectadoAbierto.Image = OFF;
                    }

                    if ((a.buffer[0] & (1 << EQUIPO_ENTREGADO)) != 0)
                    {
                        ScooterEntregado.Image = ON;
                        PollingStatus          = false;
                    }
                    else
                    {
                        ScooterEntregado.Image = OFF;
                    }

                    if ((a.buffer[0] & (1 << EQUIPO_RECIBIDO)) != 0)
                    {
                        ScooterRecibido.Image = ON;
                        PollingStatus         = false;
                    }
                    else
                    {
                        ScooterRecibido.Image = OFF;
                    }


                    break;

                default:
                    break;
                }


                Buffer_frame_RX0.data_len = 0;
                FRAME_BUFFER0             = false;
            }

            if (PollingStatus)
            {
                aux_buffer c = new aux_buffer();
                if (PuertoDatos.IsOpen)
                {
                    c = DatosMaestro.SetCommandMaster(Read_Status);
                    EnvioDatos.AppendText(BitConverter.ToString(c.buffer, 0, c.data_len) + "\r\n");
                    EnvioFrame(c);
                }
            }
        }
예제 #9
0
        private void ScanNewFrame_Tick(object sender, EventArgs e)
        {
            if(FRAME_BUFFER0)
            {
                ProtocoloRS485 a = new ProtocoloRS485();
                a = DatosMaestro.Read_Frame(Buffer_frame_RX0);

                switch (a.command)
                {
                    case Read_Status:
                        ReciboDatos.AppendText(BitConverter.ToString(Buffer_frame_RX0.buffer, 0, Buffer_frame_RX0.data_len) + "\r\n");
                        // falta informacion
                        // de estado de la scooter
                        if ((a.buffer[0] & (1 << EQUIPO_DISPONIBLE)) != 0)
                        {
                            ScooterDisponible.Image = ON;
                        }
                        else
                        {
                            ScooterDisponible.Image = OFF;
                        }

                        if ((a.buffer[0] & (1 << ESPACIO_DISPONIBLE)) != 0)
                        {
                            EspacioDisponible.Image = ON;
                        }
                        else
                        {
                            EspacioDisponible.Image = OFF;
                        }

                        if ((a.buffer[0] & (1 << EQUIPO_CONECTADO_ABIERTO)) != 0)
                        {
                            ScooterConectadoAbierto.Image = ON;
                        }
                        else
                        {
                            ScooterConectadoAbierto.Image = OFF;
                        }

                        if ((a.buffer[0] & (1 << EQUIPO_DESCONECTADO_ABIERTO)) != 0)
                        {
                            ScooterDesconectadoAbierto.Image = ON;
                        }
                        else
                        {
                            ScooterDesconectadoAbierto.Image = OFF;
                        }

                        if ((a.buffer[0] & (1 << EQUIPO_DESCONECTADO_ABIERTO)) != 0)
                        {
                            ScooterDesconectadoAbierto.Image = ON;
                        }
                        else
                        {
                            ScooterDesconectadoAbierto.Image = OFF;
                        }

                        if ((a.buffer[0] & (1 << EQUIPO_ENTREGADO)) != 0)
                        {
                            ScooterEntregado.Image = ON;
                            PollingStatus = false;
                        }
                        else
                        {
                            ScooterEntregado.Image = OFF;
                        }

                        if ((a.buffer[0] & (1 << EQUIPO_RECIBIDO)) != 0)
                        {
                            ScooterRecibido.Image = ON;
                            PollingStatus = false;
                        }
                        else
                        {
                            ScooterRecibido.Image = OFF;
                        }

                        break;
                    default:
                        break;
                }

                Buffer_frame_RX0.data_len = 0;
                FRAME_BUFFER0 = false;
            }

            if(PollingStatus)
            {
                aux_buffer c = new aux_buffer();
                if (PuertoDatos.IsOpen)
                {
                    c = DatosMaestro.SetCommandMaster(Read_Status);
                    EnvioDatos.AppendText(BitConverter.ToString(c.buffer, 0, c.data_len) + "\r\n");
                    EnvioFrame(c);
                }
            }
        }
예제 #10
0
        private void RecibeScooter_Click(object sender, EventArgs e)
        {
            aux_buffer a = new aux_buffer();

            if (PuertoDatos.IsOpen)
            {
                a = DatosMaestro.SetCommandMaster(Receive_scooter);
                EnvioDatos.AppendText(BitConverter.ToString(a.buffer, 0, a.data_len) + "\r\n");
                EnvioFrame(a);
                PollingStatus = true;
            }
            else
            {
                MessageBox.Show("Se necesita seleccionar y abrir un puerto");
            }
        }
예제 #11
0
 private void EnvioFrame(aux_buffer a)
 {
     //PuertoDatos.RtsEnable = Transmision;
     //Thread.Sleep(3); // espera 3 milisegundos antes de enviar un frame
     PuertoDatos.Write(a.buffer, 0, a.data_len);
     //Thread.Sleep(a.data_len + 3); // espera N bytes + 3 milisegundos antes de cambiar a recepcion de datos
     //PuertoDatos.RtsEnable = Recepcion;
     //PuertoDatos.
 }
예제 #12
0
        //
        public ProtocoloRS485 Read_Frame(aux_buffer Buffer_frame_RX)
        {
            byte           j;
            ProtocoloRS485 InfoRecepcion = new ProtocoloRS485();

            if (Crc_Check(Buffer_frame_RX) == true)
            {
                if (Buffer_frame_RX.buffer[0] != BYTE_START)
                {
                    InfoRecepcion.command = 0x00;
                    return(InfoRecepcion);
                }

                if (Buffer_frame_RX.buffer[1] > BUFF_SIZE_DATAS)
                {
                    InfoRecepcion.command = 0x00;             // se considera que la trama se recibio mal
                    return(InfoRecepcion);
                }
                else
                {
                    InfoRecepcion.data_len = Buffer_frame_RX.buffer[1];
                }

                InfoRecepcion.origen  = Buffer_frame_RX.buffer[2];
                InfoRecepcion.destino = Buffer_frame_RX.buffer[3];

                if (ModoMaestro)
                {
                    // Cuando actua como maestro lo datos provienen de un esclavo
                    // y la informacion destino es dirigida a el maestro
                    if ((InfoRecepcion.origen != Dir_slave) || (InfoRecepcion.destino != MASTER_ID))
                    {
                        InfoRecepcion.command = 0x00; // se considera que la trama se recibio mal
                        return(InfoRecepcion);
                    }
                }
                else
                {
                    // Cuando actua como esclavo el origen de los datos proviene de un maestro
                    // y los datos destinos es a un esclavo
                    if ((InfoRecepcion.origen != MASTER_ID) || (InfoRecepcion.destino != Dir_slave))
                    {
                        InfoRecepcion.command = 0x00; // se considera que la trama se recibio mal
                        return(InfoRecepcion);
                    }
                }


                InfoRecepcion.command = Buffer_frame_RX.buffer[4];

                if (InfoRecepcion.data_len != 0)
                {
                    for (j = 0; j <= InfoRecepcion.data_len; j++)
                    {
                        InfoRecepcion.buffer[j] = Buffer_frame_RX.buffer[5 + j];
                    }
                }
            }
            else
            {
                InfoRecepcion.command = 0x00;         // se considera que la trama se recibio mal
            }

            return(InfoRecepcion);
        }