Beispiel #1
0
 internal byte[] RequestECUData(ConsultCommand cons_cmd, ECUConst? cmd)
 {
     return RequestECUData (new byte[] { cons_cmd.Command }, cmd);
 }
Beispiel #2
0
        /// <summary>
        /// Отправить массив в порт и проверить ответ на инверсность входным данным
        /// </summary>
        /// <param name="send">Массив для отсылки</param>
        /// <param name="cmd">Тип комманды для выборочной проверки инверсии</param>
        internal void SendCommand(byte[] send, ECUConst? cmd)
        {
            byte[] receive = base.Request (send, null);
            const string errMsg = "Неожиданный ответ от устройства";
            //Проверка ответа различная, в зависимости от типа переданной команды.
            switch (cmd) {
            //Проверка каждого байта кратного трем, начиная с первого на инверсию
            //проверка остальных байт на равенство
            case ECUConst.ECU_ACTIVE_TEST_CMD:
            case ECUConst.ECU_ROM_READ_BYTE_CMD:
                if (receive.Length != send.Length)
                    throw new ConsultException (errMsg);

                    //проверяем на инверию каждый третий байт, начиная с нулевого
                    //остальные должны совпадать
                    //send: c9 80 00 c9 80 01 c9 80 02
                    //recv: 36 80 00 36 80 01 36 80 02
                    //       0  1  2  3  4  5  6  7  8
                    //       1  0  0  1  0  0  1  0  0
                for (int i = 0; i < receive.Length; i += 3) {
                    if (CheckInverseBytes (send [i], receive [i]))
                        throw new ConsultException (errMsg);
                    for (int j = i + 1; j < i + 3; j++)
                        if (send [j] != receive [j])
                            throw new ConsultException (errMsg);
                }
                break;

            //Проверка каждого второго байта, начиная с певого, на инверсию
            //проверка остальных на равенство
            case ECUConst.ECU_REG_READ_CMD:
                if (receive.Length != send.Length)
                    throw new ConsultException (errMsg);
                    // Send:
                    //5A 00 5A 01 5A 04 5A 05 5A 08 5A 09 5A 0B 5A 0C 5A 0D 5A 10
                    //5A 11 5A 13 5A 14 5A 15 5A 16 5A 1A 5A 1C 5A 1E 5A 1F 5A 21
                    //
                    // Recv:
                    //A5 00 A5 01 A5 04 A5 05 A5 08 A5 09 A5 0B A5 0C A5 0D A5 10
                    //A5 11 A5 13 A5 14 A5 15 A5 16 A5 1A A5 1C A5 1E A5 1F A5 21
                for (int i = 0; i < receive.Length; i++) {
                    if (CheckInverseBytes (send [i], receive [i]))
                        throw new ConsultException (errMsg);
                    i++;
                    if (receive [i] == (byte)ECUConst.ECU_REG_NOT_SUPPORTED)
                        throw new NotSupportedException ();
                }
                break;

            //Проверка всех байт на инверсию
            case null:
            default:
                if (send.Length != receive.Length || CheckInverseBytes (receive, send))
                    throw new ConsultException (errMsg);
                break;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Запросить ответ от устройства с завершающим символом приема данных (ECUConst.ECU_END_RX)
        /// </summary>
        /// <param name="cmd">Массив для передачи</param>
        /// <param name="cmd_arr">Тип команды</param>
        /// <returns>ответ</returns>
        internal byte[] RequestECUData(byte[] cmd_arr, ECUConst? cmd)
        {
            //Отправка запроса и проверка корреткности ответа ECU
            SendCommand (cmd_arr, cmd);

            //Подаем сигнал о том, что ждем фрейм от ECU
            ECUFrameStart ();

            //принимаем фрейм
            byte[] frame = ECUFrameGet ();

            //Останавливаем передачу данных
            ECUFrameStop ();

            return frame;
        }