public override bool sendMessage(CANMessage a_message) { string sendString = " "; for (uint i = 0; i < a_message.getLength(); i++) // leave out the length field, the ELM chip assigns that for us { //if (i <= 7) { sendString += a_message.getCanData(i).ToString("X2"); } /*else * { * sendString += "00"; // fill with zeros * }*/ } sendString += "\r"; if (m_serialPort.IsOpen) { m_serialPort.Write(sendString); //Console.WriteLine("TX: " + sendString); } // bitrate = 38400bps -> 3840 bytes per second // sending each byte will take 0.2 ms approx Thread.Sleep(a_message.getLength()); // sleep length ms // Thread.Sleep(10); //receiveString = "49 01 01 00 00 00 31 \n\r49 02 02 44 34 47 50 \n\r49 02 03 30 30 52 35 \n\r49 02 04 25 42";// m_serialPort.ReadTo(">"); /*receiveString = m_serialPort.ReadTo(">"); * char[] chrArray = receiveString.ToCharArray(); * byte[] reply = new byte[0xFF]; * int insertPos = 1; * int index = 0; * string subString = ""; * while (receiveString.Length > 4) * { * * //Remove first three bytes * * //TODO. Remove Mode and PIDs * for (int i = 0; i < 3; i++) * { * index = receiveString.IndexOf(" "); * receiveString = receiveString.Remove(0, index + 1); * } * //Read data for the rest of the row. * for (int i = 0; i < 4; i++) * { * index = receiveString.IndexOf(" "); * if (index == 0) //Last row not 4 bytes of data. * { * continue; * } * subString = receiveString.Substring(0, index); * reply[insertPos] = (byte)Convert.ToInt16("0x" + subString, 16); * insertPos++; * receiveString = receiveString.Remove(0, index + 1); * } * * } * * reply[0] = (byte)insertPos; //Length * * r_reply = new KWPReply(reply, a_request.getNrOfPID()); * return RequestResult.NoError;*/ return(true); // remove after implementation }
public int query_data(byte unit, byte data_id, out byte[] answer) { byte[] data = new byte[8]; byte length= 0; byte i = 0; answer = new byte[8]; // test <GS-11012011> int rcv_length; byte[] query = new byte[8] { 0x40, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00 }; byte[] ack = new byte[8] { 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00 }; //ulong query_long = 0x0000000021020040; //ulong ack_long = 0x00000000003F0040; query[1] = unit; ack[1] = unit; // If data_id is zero, decrease length field if (data_id != 0x00) query[4] = data_id; else query[2] = 0x01; data[0] = 0x00; rcv_length = 0; //for (int i = 0; i < 5; i++) { CANMessage msg = new CANMessage(0x240, 0, 8); //msg.setData(query_long); msg.setCanData(query[0], 0); msg.setCanData(query[1], 1); msg.setCanData(query[2], 2); msg.setCanData(query[3], 3); msg.setCanData(query[4], 4); msg.setCanData(query[5], 5); msg.setCanData(query[6], 6); msg.setCanData(query[7], 7); msg.setID(0x240); AddToCanTrace("Sending: 0x" + msg.getData().ToString("X16") + " id: 0x" + msg.getID().ToString("X4")); if (!sendMessage(msg)) { return -1; } uint reply_unit = GetReplyforUnit(unit); reply_unit = 0x258; // for testing purposes while (data[0] != 0x80 && data[0] != 0xC0) { CANMessage replyMessage = new CANMessage(); AddToCanTrace("Waiting for ID: 0x" + reply_unit.ToString("X4")); if (waitForMessage(reply_unit, 1000, out replyMessage) == reply_unit) { AddToCanTrace("Rx data: " + replyMessage.getData().ToString("X16")); data[0] = replyMessage.getCanData(0); data[1] = replyMessage.getCanData(1); data[2] = replyMessage.getCanData(2); data[3] = replyMessage.getCanData(3); data[4] = replyMessage.getCanData(4); data[5] = replyMessage.getCanData(5); data[6] = replyMessage.getCanData(6); data[7] = replyMessage.getCanData(7); int idx = 0; if ((data[0] & 0x40) > 0) { if (data[2] > 0x02) { length = data[2]; // subtract two non-payload bytes length -= 2; answer = new byte[length]; } else length = 0; if (--length > 0) { answer[idx++] = data[5]; rcv_length++; } if (--length > 0) { answer[idx++] = data[6]; rcv_length++; } if (--length > 0) { answer[idx++] = data[7]; rcv_length++; } } else { for (i = 0; i < 6; i++) { answer[idx++] = data[2 + i]; length--; rcv_length++; if (length == 0) i = 6; } } // Send acknowledgement ack[3] = Convert.ToByte(data[0] & 0xBF); CANMessage ackMessage = new CANMessage(); //ackMessage.setData(ack_long); ackMessage.setCanData(ack[0], 0); ackMessage.setCanData(ack[1], 1); ackMessage.setCanData(ack[2], 2); ackMessage.setCanData(ack[3], 3); ackMessage.setCanData(ack[4], 4); ackMessage.setCanData(ack[5], 5); ackMessage.setCanData(ack[6], 6); ackMessage.setCanData(ack[7], 7); ackMessage.setID(0x266); sendMessage(ackMessage); } else { // Timeout AddToCanTrace("Timeout waiting for 0x" + reply_unit.ToString("X3")); return -1; } } } return rcv_length; }
public override bool sendMessage(CANMessage a_message) { string sendString = " "; for (uint i = 0; i < a_message.getLength(); i++) // leave out the length field, the ELM chip assigns that for us { //if (i <= 7) { sendString += a_message.getCanData(i).ToString("X2"); } /*else { sendString += "00"; // fill with zeros }*/ } sendString += "\r"; if (m_serialPort.IsOpen) { m_serialPort.Write(sendString); //Console.WriteLine("TX: " + sendString); } // bitrate = 38400bps -> 3840 bytes per second // sending each byte will take 0.2 ms approx Thread.Sleep(a_message.getLength()); // sleep length ms // Thread.Sleep(10); //receiveString = "49 01 01 00 00 00 31 \n\r49 02 02 44 34 47 50 \n\r49 02 03 30 30 52 35 \n\r49 02 04 25 42";// m_serialPort.ReadTo(">"); /*receiveString = m_serialPort.ReadTo(">"); char[] chrArray = receiveString.ToCharArray(); byte[] reply = new byte[0xFF]; int insertPos = 1; int index = 0; string subString = ""; while (receiveString.Length > 4) { //Remove first three bytes //TODO. Remove Mode and PIDs for (int i = 0; i < 3; i++) { index = receiveString.IndexOf(" "); receiveString = receiveString.Remove(0, index + 1); } //Read data for the rest of the row. for (int i = 0; i < 4; i++) { index = receiveString.IndexOf(" "); if (index == 0) //Last row not 4 bytes of data. { continue; } subString = receiveString.Substring(0, index); reply[insertPos] = (byte)Convert.ToInt16("0x" + subString, 16); insertPos++; receiveString = receiveString.Remove(0, index + 1); } } reply[0] = (byte)insertPos; //Length r_reply = new KWPReply(reply, a_request.getNrOfPID()); return RequestResult.NoError;*/ return true; // remove after implementation }
public int query_data(byte unit, byte data_id, out byte[] answer) { byte[] data = new byte[8]; byte length = 0; byte i = 0; answer = new byte[8]; // test <GS-11012011> int rcv_length; byte[] query = new byte[8] { 0x40, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00 }; byte[] ack = new byte[8] { 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00 }; //ulong query_long = 0x0000000021020040; //ulong ack_long = 0x00000000003F0040; query[1] = unit; ack[1] = unit; // If data_id is zero, decrease length field if (data_id != 0x00) { query[4] = data_id; } else { query[2] = 0x01; } data[0] = 0x00; rcv_length = 0; //for (int i = 0; i < 5; i++) { CANMessage msg = new CANMessage(0x240, 0, 8); //msg.setData(query_long); msg.setCanData(query[0], 0); msg.setCanData(query[1], 1); msg.setCanData(query[2], 2); msg.setCanData(query[3], 3); msg.setCanData(query[4], 4); msg.setCanData(query[5], 5); msg.setCanData(query[6], 6); msg.setCanData(query[7], 7); msg.setID(0x240); AddToCanTrace("Sending: 0x" + msg.getData().ToString("X16") + " id: 0x" + msg.getID().ToString("X4")); if (!sendMessage(msg)) { return(-1); } uint reply_unit = GetReplyforUnit(unit); reply_unit = 0x258; // for testing purposes while (data[0] != 0x80 && data[0] != 0xC0) { CANMessage replyMessage = new CANMessage(); AddToCanTrace("Waiting for ID: 0x" + reply_unit.ToString("X4")); if (waitForMessage(reply_unit, 1000, out replyMessage) == reply_unit) { AddToCanTrace("Rx data: " + replyMessage.getData().ToString("X16")); data[0] = replyMessage.getCanData(0); data[1] = replyMessage.getCanData(1); data[2] = replyMessage.getCanData(2); data[3] = replyMessage.getCanData(3); data[4] = replyMessage.getCanData(4); data[5] = replyMessage.getCanData(5); data[6] = replyMessage.getCanData(6); data[7] = replyMessage.getCanData(7); int idx = 0; if ((data[0] & 0x40) > 0) { if (data[2] > 0x02) { length = data[2]; // subtract two non-payload bytes length -= 2; answer = new byte[length]; } else { length = 0; } if (--length > 0) { answer[idx++] = data[5]; rcv_length++; } if (--length > 0) { answer[idx++] = data[6]; rcv_length++; } if (--length > 0) { answer[idx++] = data[7]; rcv_length++; } } else { for (i = 0; i < 6; i++) { answer[idx++] = data[2 + i]; length--; rcv_length++; if (length == 0) { i = 6; } } } // Send acknowledgement ack[3] = Convert.ToByte(data[0] & 0xBF); CANMessage ackMessage = new CANMessage(); //ackMessage.setData(ack_long); ackMessage.setCanData(ack[0], 0); ackMessage.setCanData(ack[1], 1); ackMessage.setCanData(ack[2], 2); ackMessage.setCanData(ack[3], 3); ackMessage.setCanData(ack[4], 4); ackMessage.setCanData(ack[5], 5); ackMessage.setCanData(ack[6], 6); ackMessage.setCanData(ack[7], 7); ackMessage.setID(0x266); sendMessage(ackMessage); } else { // Timeout AddToCanTrace("Timeout waiting for 0x" + reply_unit.ToString("X3")); return(-1); } } } return(rcv_length); }