Стартовая страница › Форумы › Разработка и интеграция › Остановка опроса по массиву байт или байту
- В этой теме 49 ответов, 2 участника, последнее обновление 4 года, 6 месяцев назад сделано Mikhail.
-
АвторСообщения
-
24.08.2019 в 08:50 #13404MikhailМодератор
index — если не ошибаюсь, это индекс байта в массиве buffer, который только что получен.
А как передать буферы сравнения ?
Добавить соответствующие свойства в свой класс и присвоить их, скорее всего, в конструкторе класса.
16.10.2019 в 17:58 #13902manjey73УчастникДобрый день, Михаил.
Ткните носом как это вообще реализовывать ?
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
Уже всю голову сломал…
16.10.2019 в 18:06 #13905MikhailМодераторПо реализации MyStopCondition:
При создании объекта класса MyStopCondition, Вам нужно передать этому объекту 2 массива, которые являются условиями проверки. Для этого нужно завести свойства (или хотя бы поля) внутри класса MyStopCondition, в которые передать эти массивы. Ну либо прописать второй конструктор класса, чтобы передать эти массивы как параметры.При проверке по двум массивам: возьмите за основу код из класса BinStopCondition. После проверки по первому массиву сделайте такую же проверку по второму.
16.10.2019 в 18:09 #13906MikhailМодераторВедь эта часть никогда не будет работать
Для CE30x, похоже да. А для CE6850 не всегда передаётся ноль.
Наверное при копировании кода появился этот атавизм в CE30x.16.10.2019 в 21:16 #13907manjey73УчастникПри проверке по двум массивам: возьмите за основу код из класса BinStopCondition. После проверки по первому массиву сделайте такую же проверку по второму.
То есть проверка сразу по двум массивам будет происходить не на лету а сперва по одному, потом только по другому ?
Если будет время, хотя бы набросок кода для примера, как это все сделать.
Хм, посмотрю код CE6850, но кажется там так же…
17.10.2019 в 13:40 #13911manjey73УчастникВсе равно не понимаю. Если MyStopCondition является наследником от Connection.BinStopCondition то как проводить проверку при чтении сразу по двум массивам ? как в эту всю конструкцию попадает входящий массив, как индексируется это все ????
Речь идет, чтобы никак не затрагивать код Connection, не лезть туда и чтобы все работало как при работе через порт, так и при работе поверх TCP и UDP…
Два раза обрабатывать входной буфер ? а смысл, тогда ждем по таймауту и спокойно все проверяем, только долго будет…пол дня убил найти код BinStopCondition по массивам байт, а оно в develop блин 🙂
- Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
17.10.2019 в 20:21 #13915MikhailМодераторкак в эту всю конструкцию попадает входящий массив
Массивы, которые являются условиями остановки, нужно присвоить при создании объекта MyStopCondition.
Массив, который получен от прибора, будет передан в метод CheckCondition в переменную buffer Коммуникатором.Входной буфер сравнивается при получении каждого нового байта. Но сравнение на каждом байте как бы начинается каждый раз заново. Это всё равно будет быстрее, чем ждать таймаута.
17.10.2019 в 20:22 #13916MikhailМодератора оно в develop
Надо слить в мастер, спасибо, что заметили.
17.10.2019 в 20:41 #13917manjey73УчастникДа, я в курсе, что так будет быстрее, но не получается засунуть переменные в MyStopCondition.
BinStopCondition требует указания :base(переменная)
То есть
public MyStopCondition(byte[] stopSeq) : base(stopSeq)
{
}
без этого никак.
Если делать
public MyStopCondition(byte[] stopSeq, byte[] stopSeq1) : base(stopSeq)
{
}Толку от этого ? я не понимаю как использовать byte[] stopSeq1, так как в базовый класс будет передана byte[] stopSeq
А в нете как всегда, примитивные примеры. А сам я не осилю…
17.10.2019 в 20:48 #13918manjey73УчастникПробовал и дополнительно класс внутри сделать, все равно лыжи не едут…
Вот и нужен пример как?, саму логику уже как-то прикручу, надеюсь.17.10.2019 в 21:08 #13919manjey73УчастникНу и как вариант, передать не два массива байт а List<byte[]> ?
18.10.2019 в 04:05 #13920MikhailМодераторВ конструкторе base(stopSeq) можно вообще убрать.
Примерно так:public MyStopCondition(byte[] stopSeq1, byte[] stopSeq2) { StopSeq1 = stopSeq1; StopSeq2 = stopSeq2; } public byte[] StopSeq1 { get; protected set; } public byte[] StopSeq2 { get; protected set; }
18.10.2019 в 04:07 #13921MikhailМодераторА проверку попробуйте так (не проверял):
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); } }
18.10.2019 в 08:55 #13922manjey73Участникbase(stopSeq) не убирается, потому что сразу
Connection.BinStopCondition Не содержит конструктор, который принимает аргументы 0
А для этого надо править родительский BinStopCondition как я понимаю….
По этому и не выходит каменный цветок. Сейчас по другому попробую, но не уверен, что получится.
- Этот ответ был изменен 4 года, 6 месяцев назад от manjey73.
18.10.2019 в 09:36 #13924manjey73УчастникПытался сделать вложенный public class но и тут не получается.
Невызываемый член не может использоваться как метод. бла-бла-бла….
хрен его знает как тогда ?
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.