Остановка опроса по массиву байт или байту

Стартовая страница Форумы Разработка и интеграция Остановка опроса по массиву байт или байту

Просмотр 5 сообщений - с 46 по 50 (из 50 всего)
  • Автор
    Сообщения
  • #13955
    manjey73
    Участник
            public class MyStopCondition : Connection.BinStopCondition // TEST логики остановки по двум массивам
            {
                public MyStopCondition(byte[] stop0, byte[] stop1) : base(stop0)
                {
                    Stop0 = stop0;
                    Stop1 = stop1;
                }
                public byte[] Stop0 { get; protected set; }
                public byte[] Stop1 { get; protected set; }
    
                public override bool CheckCondition(byte[] buffer, int index)
                {
                    StopSeq = Stop0;
                    if (base.CheckCondition(buffer, index))
                    {
                        return true;
                    }
                    else
                    {
                        StopSeq = Stop1;
                        return base.CheckCondition(buffer, index);
                    }
                }
            }
    
                    MyStopCondition testStop = new MyStopCondition(new byte[] { 0x0D, 0x0A }, new byte[] { 0x03, 0x50 });
    
    bool stopReceived;
                    readCnt = Connection.Read(buffer, 0, MaxRxDLen, ReqParams.Timeout,
                        testStop, out stopReceived, CommUtils.ProtocolLogFormats.String, out logText);

    в итоге так срабатывает либо по одному, либо по второму массиву

    #13962
    manjey73
    Участник

    В общем сделал даже по List<byte[]>

    в public class KpXXXXLogic : KPLogic добавил

            private readonly static MyStopCondition testStop;
            private static List<byte[]> stopList = new List<byte[]>();
    
            public class MyStopCondition : Connection.BinStopCondition // TEST логики остановки по двум массивам
            {
                public MyStopCondition(List<byte[]> stopL)
                {
                    Stop = stopL;
                }
    
                public List<byte[]> Stop { get; private set; }
    
                public override bool CheckCondition(byte[] buffer, int index)
                {
                    bool checkStop = false;
                    for (int u = 0; u < Stop.Count; u++)
                    {
                        StopSeq = Stop[u];
                        checkStop = base.CheckCondition(buffer, index);
                        if (checkStop)
                            break;
                    }
                    return checkStop;
                }
            }
    

    В конструктор static KpXXXXLogic() добавил

                byte[] stop0 = new byte[] { 0x0D, 0x0A }; // массив остановки 1
                byte[] stop1 = new byte[] { 0x03, 0x50 }; // массив остановки 2
    
                if (stopList.IndexOf(stop0) == -1)
                    stopList.Add(stop0);
                if (stopList.IndexOf(stop1) == -1)
                    stopList.Add(stop1);
    
                testStop = new MyStopCondition(stopList);

    Ну и собственно чтение с остановкой

                    bool stopReceived;
                    readCnt = Connection.Read(buffer, 0, MaxRxDLen, ReqParams.Timeout,
                        testStop, out stopReceived, CommUtils.ProtocolLogFormats.String, out logText); 
    

    Надеюсь будет и по трем массивам останавливать ,чуть позже проверю. Надо только добавить в ScadaCommCommon.Connection.BinStopCondition пустой конструктор, чтобы base не вводить

    И не очень нравится код проверки в цикле с выходом, может можно как-то красивее сделать ?
    Ну и то, что List массивов является ссылочным, надо создавать массивы отдельно для каждого примера остановки.

    • Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
    • Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
    #13968
    Mikhail
    Модератор

    Можно сделать
    if (base.CheckCondition(buffer, index))
    return true;

    а в конце метода return false;

    Можно попробовать stopList.AddRange(и здесь передать все массивы)
    Дело вкуса.

    #13969
    manjey73
    Участник

    Спасибо, переделал через foreach с кодом, что дали выше и массивы заполнил через AddRange. Вполне красиво получилось.

    Не забудьте в следующей версии добавить пустой конструктор в BinStopCondition в релизе, я пока сам добавил для проверки.

    • Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
    #13974
    Mikhail
    Модератор

    пустой конструктор в BinStopCondition

    OK

Просмотр 5 сообщений - с 46 по 50 (из 50 всего)
  • Вы должны авторизироваться для ответа в этой теме.