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

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

Просмотр 15 сообщений - с 16 по 30 (из 50 всего)
  • Автор
    Сообщения
  • #13404
    Mikhail
    Модератор

    index — если не ошибаюсь, это индекс байта в массиве buffer, который только что получен.

    А как передать буферы сравнения ?

    Добавить соответствующие свойства в свой класс и присвоить их, скорее всего, в конструкторе класса.

    #13902
    manjey73
    Участник

    Добрый день, Михаил.

    Ткните носом как это вообще реализовывать ?

    
            private class MyStopCondition : Connection.BinStopCondition // TEST логики остановки по двум массивам
            {
                public MyStopCondition(byte[] stopSeq) : base(stopSeq)
                {
                }
    
                public override bool CheckCondition(byte[] buffer, int index)
                {
                    bool stopReq = false;
                    // ваша логика проверки
    
    Собственно как оно тут должно быть ? вообще не представляю как сюда передать два или более массивов для остановки и остановку по любому из них ?
    
                    return stopReq;
                }
            }
    

    И ковыряю драйвер CE30x и CE6850 тоже не понимаю кода

    
     private void ReadAnswer(byte[] buffer, byte lastByte, out int readCnt, out string logText)
            {
                if (lastByte > 0)
                {
                    bool stopReceived;
                    readCnt = Connection.Read(buffer, 0, MaxRxDLen, ReqParams.Timeout,
                        new Connection.BinStopCondition(lastByte), out stopReceived,
                        CommUtils.ProtocolLogFormats.String, out logText);
                }
    
     

    Ведь эта часть никогда не будет работать, потому что ниже в опросе

    
                       // получение ответа
                        ReadAnswer(inBuf, 0, out inBufLen, out logText);
                        WriteToLog(logText);
    

    lastByte передается всегда 0

    Мне надо остановить либо по одному массиву без дочитывания байта CS либо по второму массиву с дочитыванием байта CS

    Уже всю голову сломал…

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

    По реализации MyStopCondition:
    При создании объекта класса MyStopCondition, Вам нужно передать этому объекту 2 массива, которые являются условиями проверки. Для этого нужно завести свойства (или хотя бы поля) внутри класса MyStopCondition, в которые передать эти массивы. Ну либо прописать второй конструктор класса, чтобы передать эти массивы как параметры.

    При проверке по двум массивам: возьмите за основу код из класса BinStopCondition. После проверки по первому массиву сделайте такую же проверку по второму.

    #13906
    Mikhail
    Модератор

    Ведь эта часть никогда не будет работать

    Для CE30x, похоже да. А для CE6850 не всегда передаётся ноль.
    Наверное при копировании кода появился этот атавизм в CE30x.

    #13907
    manjey73
    Участник

    При проверке по двум массивам: возьмите за основу код из класса BinStopCondition. После проверки по первому массиву сделайте такую же проверку по второму.

    То есть проверка сразу по двум массивам будет происходить не на лету а сперва по одному, потом только по другому ?

    Если будет время, хотя бы набросок кода для примера, как это все сделать.

    Хм, посмотрю код CE6850, но кажется там так же…

    #13911
    manjey73
    Участник

    Все равно не понимаю. Если MyStopCondition является наследником от Connection.BinStopCondition то как проводить проверку при чтении сразу по двум массивам ? как в эту всю конструкцию попадает входящий массив, как индексируется это все ????

    Речь идет, чтобы никак не затрагивать код Connection, не лезть туда и чтобы все работало как при работе через порт, так и при работе поверх TCP и UDP…
    Два раза обрабатывать входной буфер ? а смысл, тогда ждем по таймауту и спокойно все проверяем, только долго будет…

    пол дня убил найти код BinStopCondition по массивам байт, а оно в develop блин 🙂

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

    как в эту всю конструкцию попадает входящий массив

    Массивы, которые являются условиями остановки, нужно присвоить при создании объекта MyStopCondition.
    Массив, который получен от прибора, будет передан в метод CheckCondition в переменную buffer Коммуникатором.

    Входной буфер сравнивается при получении каждого нового байта. Но сравнение на каждом байте как бы начинается каждый раз заново. Это всё равно будет быстрее, чем ждать таймаута.

    #13916
    Mikhail
    Модератор

    а оно в develop

    Надо слить в мастер, спасибо, что заметили.

    #13917
    manjey73
    Участник

    Да, я в курсе, что так будет быстрее, но не получается засунуть переменные в MyStopCondition.

    BinStopCondition требует указания :base(переменная)

    То есть

    public MyStopCondition(byte[] stopSeq) : base(stopSeq)
    {
    }
    без этого никак.
    Если делать
    public MyStopCondition(byte[] stopSeq, byte[] stopSeq1) : base(stopSeq)
    {
    }

    Толку от этого ? я не понимаю как использовать byte[] stopSeq1, так как в базовый класс будет передана byte[] stopSeq

    А в нете как всегда, примитивные примеры. А сам я не осилю…

    #13918
    manjey73
    Участник

    Пробовал и дополнительно класс внутри сделать, все равно лыжи не едут…
    Вот и нужен пример как?, саму логику уже как-то прикручу, надеюсь.

    #13919
    manjey73
    Участник

    Ну и как вариант, передать не два массива байт а List<byte[]> ?

    #13920
    Mikhail
    Модератор

    В конструкторе base(stopSeq) можно вообще убрать.
    Примерно так:

    public MyStopCondition(byte[] stopSeq1, byte[] stopSeq2)
    {
      StopSeq1 = stopSeq1;
      StopSeq2 = stopSeq2;
    }
    
    public byte[] StopSeq1 { get; protected set; }
    public byte[] StopSeq2 { get; protected set; }
    
    #13921
    Mikhail
    Модератор

    А проверку попробуйте так (не проверял):

    public override bool CheckCondition(byte[] buffer, int index)
    {
      StopSeq = StopSeq1;
      if (base.CheckCondition(buffer, index))
      {
        return true;
      }
      else
      {
        StopSeq = StopSeq2;
        return base.CheckCondition(buffer, index);
      }
    }
    #13922
    manjey73
    Участник

    base(stopSeq) не убирается, потому что сразу

    Connection.BinStopCondition Не содержит конструктор, который принимает аргументы 0

    А для этого надо править родительский BinStopCondition как я понимаю….

    По этому и не выходит каменный цветок. Сейчас по другому попробую, но не уверен, что получится.

    • Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
    #13924
    manjey73
    Участник

    Пытался сделать вложенный public class но и тут не получается.

    Невызываемый член не может использоваться как метод. бла-бла-бла….

    хрен его знает как тогда ?

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