Храните данные, передаваемые последовательным портом каждый раз, когда вызывается serialdatareceivedeventhandler
Приведенная ниже программа компилируется и выполняется без каких-либо ошибок, а также показывает все данные, возвращаемые последовательным портом.
Но я знаю, что событие SerialDataReceivedEventHandler вызывается несколько раз, и каждый раз, когда оно вызывается, оно приносит кусок данных.
Я просто хочу, чтобы хранить, что набор данных для каждого SerialDataReceivedEvent отдельно,так, чтобы обработать его,проанализировать его,расшифровать его.
может ли кто-нибудь просто пройти через код и сказать мне, что я должен делать?
Что я уже пробовал:
public class DataReceiveHandle { public static int MAX_PACKET_LENGTH = ChannelDataCount.count; public bool newData = false; public int rxOffset = 0; public byte[] rxBuffer = new byte[MAX_PACKET_LENGTH]; public byte[] rxPackage = new byte[MAX_PACKET_LENGTH]; public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { // Console.WriteLine("In Data receive "); if (e.EventType != SerialData.Chars) return; SerialPort port = (SerialPort)sender; int bytesCount = port.BytesToRead; port.Read(rxBuffer, rxOffset, bytesCount); rxOffset = rxOffset + bytesCount; if (HasCompletePackage()) { Console.WriteLine("Full packet has been received"); rxBuffer.CopyTo(rxPackage, 0); rxOffset = 0; newData = true; } if (newData == true) { if (rxPackage[0] == 224 && rxPackage[1] == 242 && rxPackage[2] == 1 && rxPackage[3] == 0 && rxPackage[4] == 60 && rxPackage[5] == 37 && rxPackage[6] == 132 && rxPackage[7] == 0 && rxPackage[8] == 0) { Console.WriteLine("Header Content is:"); for (int i = 0; i <= 8; i++) { Console.WriteLine(rxPackage[i]); } } Console.WriteLine("Message Content is: "); for (int i = 9; i < MAX_PACKET_LENGTH; i++) { Console.WriteLine(rxPackage[i]); } } } private bool HasCompletePackage() { if (rxOffset == 60) return true; else return false; } }
Jochen Arndt
Намерение моего ответа на ваш предыдущий вопрос состояло в том, что обработка полных пакетов выполняется основным потоком. Это должно быть сообщено, когда новый пакет доступен, и затем может получить копию данных, которая включает в себя очистку newData впоследствии.
Вы даже можете опустить использование переменной newData при использовании соответствующего метода сигнализации или метода сообщения, включающего данные. Читайте о вызове / делегировании.
Nishikant Tayade
@JochenArndt Спасибо,я все понял.Есть ли какой-либо способ использовать циклический буфер или динамический массив для хранения данных, которые отправляются последовательным портом за один раз, а затем анализировать то, что доступно в буфере, а затем снова помещать в него данные и так далее.
Nishikant Tayade
@JochenArndt я понял,что вы сказали, но хотя я могу получить целые данные, а затем выполнить их обработку.Что я хочу сделать, так это получить этот кусок данных и обработать его.
Jochen Arndt
Обнаружение и обработка полных пакетов. Почему вы хотите обрабатывать частичные данные, когда вам все равно нужно выполнить окончательную обработку после завершения пакета?
Nishikant Tayade
Поскольку событие получения данных срабатывает несколько раз,оно приносит этот кусок данных, поэтому вместо ожидания получения полных данных(что может быть дорогостоящим по времени)
Я хочу проверить, что такое данные, отправляемые последовательным портом, и начать работать только с этими ограниченными данными.
Вот почему я спрашиваю о круговом буфере.
Jochen Arndt
Обработка обычно занимает гораздо меньше времени, чем последовательная передача, которая довольно медленная, и прием обрабатывается в своем собственном потоке, так что другие части вашего приложения (в основном графический интерфейс) не блокируются.
Время получения полного пакета, вероятно, будет находиться в диапазоне от десятой до сотой миллисекунды, в то время как обработка полного пакета будет в 1000 и более раз быстрее. Выполнение части обработки заранее сэкономит вам всего несколько микро-или даже наносекунд. Заботится ли это об обработке таких асинхронных событий, когда полный пакет принимается довольно редко (по сравнению со временем выполнения)?
Таким образом, время не является причиной для частичной обработки.
Использование циклического буфера возможно, но не обязательно здесь при копировании полных данных в новый буфер, как в моем примере. Это сделало бы код намного сложнее. А сложный код подвержен ошибкам.
Используйте принцип поцелуя (держите его простым, глупым).
Nishikant Tayade
Спасибо.Покажу это боссу.