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); }
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. }
// 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); }
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"); } }
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"); } }
// // 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); }
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); } } }
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); } } }
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"); } }
// 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); }