/// <summary> /// Считать данные из последовательного порта /// </summary> /// <param name="serialPort">Последовательный порт</param> /// <param name="buffer">Буфер принимаемых данных</param> /// <param name="index">Начальный индекс в буфере</param> /// <param name="maxCount">Максимальное количество принимаемых байт</param> /// <param name="stopCode">Байт, означающий окончание считывания данных</param> /// <param name="timeout">Таймаут чтения данных, мс</param> /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param> /// <param name="logFormat">Формат вывода данных в журнал</param> /// <param name="logText">Строка для вывода в журнал</param> /// <returns>Количество считанных байт</returns> public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int maxCount, byte stopCode, int timeout, bool wait, SerialLogFormat logFormat, out string logText) { int readCnt = 0; if (serialPort == null) { logText = KPUtils.ReadDataImpossible; } else { DateTime nowDT = DateTime.Now; DateTime startDT = nowDT; DateTime stopDT = startDT.AddMilliseconds(timeout); bool stop = false; int curInd = index; serialPort.ReadTimeout = 0; while (readCnt <= maxCount && !stop && startDT <= nowDT && nowDT <= stopDT) { bool readOk; try { readOk = serialPort.Read(buffer, curInd, 1) > 0; } catch { readOk = false; } if (readOk) { stop = buffer[curInd] == stopCode; curInd++; readCnt++; } else { Thread.Sleep(100); // накопление входных данных в буфере порта } nowDT = DateTime.Now; } logText = ReceiveNotation + " (" + readCnt + "): " + (logFormat == SerialLogFormat.Hex ? BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt)); if (wait && startDT <= nowDT) { int delay = (int)(stopDT - nowDT).TotalMilliseconds; if (delay > 0) { Thread.Sleep(delay); } } } return(readCnt); }
/// <summary> /// Считать данные из последовательного порта /// </summary> /// <param name="serialPort">Последовательный порт</param> /// <param name="buffer">Буфер принимаемых данных</param> /// <param name="index">Начальный индекс в буфере</param> /// <param name="count">Количество принимаемых байт</param> /// <param name="timeout">Таймаут чтения данных, мс</param> /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param> /// <param name="logFormat">Формат вывода данных в журнал</param> /// <param name="logText">Строка для вывода в журнал</param> /// <returns>Количество считанных байт</returns> public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int count, int timeout, bool wait, SerialLogFormat logFormat, out string logText) { int readCnt = 0; if (serialPort == null) { logText = ReadDataImpossible; } else { // данный способ чтения данных необходим для избежания исключения // System.ObjectDisposedException при прерывании потока линии связи DateTime nowDT = DateTime.Now; DateTime startDT = nowDT; DateTime stopDT = startDT.AddMilliseconds(timeout); serialPort.ReadTimeout = 0; while (readCnt < count && startDT <= nowDT && nowDT <= stopDT) { try { readCnt += serialPort.Read(buffer, index + readCnt, count - readCnt); } catch { /*The operation has timed out*/ } if (readCnt < count) { Thread.Sleep(100); // накопление входных данных в буфере порта } nowDT = DateTime.Now; } logText = ReceiveNotation + " (" + readCnt + "/" + count + "): " + (logFormat == SerialLogFormat.Hex ? BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt)); if (wait && startDT <= nowDT) { int delay = (int)(stopDT - nowDT).TotalMilliseconds; if (delay > 0) { Thread.Sleep(delay); } } } return(readCnt); }
/// <summary> /// Записать данные в последовательный порт /// </summary> /// <param name="serialPort">Последовательный порт</param> /// <param name="buffer">Буфер передаваемых данных</param> /// <param name="index">Начальный индекс в буфере</param> /// <param name="count">Количество передаваемых байт</param> /// <param name="logFormat">Формат вывода данных в журнал</param> /// <param name="logText">Строка для вывода в журнал</param> public static void WriteToSerialPort(SerialPort serialPort, byte[] buffer, int index, int count, SerialLogFormat logFormat, out string logText) { try { if (serialPort == null) { logText = WriteDataImpossible; } else { serialPort.DiscardInBuffer(); serialPort.DiscardOutBuffer(); serialPort.Write(buffer, index, count); logText = SendNotation + " (" + count + "): " + (logFormat == SerialLogFormat.Hex ? BytesToHex(buffer, index, count) : BytesToString(buffer, index, count)); } } catch (Exception ex) { logText = (Localization.UseRussian ? "Ошибка при отправке данных: " : "Error sending data: ") + ex.Message; } }
/// <summary> /// Считать данные из последовательного порта /// </summary> /// <param name="serialPort">Последовательный порт</param> /// <param name="buffer">Буфер принимаемых данных</param> /// <param name="index">Начальный индекс в буфере</param> /// <param name="maxCount">Максимальное количество принимаемых байт</param> /// <param name="stopCode">Байт, означающий окончание считывания данных</param> /// <param name="timeout">Таймаут чтения данных, мс</param> /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param> /// <param name="logFormat">Формат вывода данных в журнал</param> /// <param name="logText">Строка для вывода в журнал</param> /// <returns>Количество считанных байт</returns> public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int maxCount, byte stopCode, int timeout, bool wait, SerialLogFormat logFormat, out string logText) { int readCnt = 0; if (serialPort == null) { logText = KPUtils.ReadDataImpossible; } else { DateTime nowDT = DateTime.Now; DateTime startDT = nowDT; DateTime stopDT = startDT.AddMilliseconds(timeout); bool stop = false; int curInd = index; serialPort.ReadTimeout = 0; while (readCnt <= maxCount && !stop && startDT <= nowDT && nowDT <= stopDT) { bool readOk; try { readOk = serialPort.Read(buffer, curInd, 1) > 0; } catch { readOk = false; } if (readOk) { stop = buffer[curInd] == stopCode; curInd++; readCnt++; } else { Thread.Sleep(100); // накопление входных данных в буфере порта } nowDT = DateTime.Now; } logText = ReceiveNotation + " (" + readCnt + "): " + (logFormat == SerialLogFormat.Hex ? BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt)); if (wait && startDT <= nowDT) { int delay = (int)(stopDT - nowDT).TotalMilliseconds; if (delay > 0) Thread.Sleep(delay); } } return readCnt; }
/// <summary> /// Считать данные из последовательного порта /// </summary> /// <param name="serialPort">Последовательный порт</param> /// <param name="buffer">Буфер принимаемых данных</param> /// <param name="index">Начальный индекс в буфере</param> /// <param name="count">Количество принимаемых байт</param> /// <param name="timeout">Таймаут чтения данных, мс</param> /// <param name="wait">Ожидать завершения таймаута после окончания чтения</param> /// <param name="logFormat">Формат вывода данных в журнал</param> /// <param name="logText">Строка для вывода в журнал</param> /// <returns>Количество считанных байт</returns> public static int ReadFromSerialPort(SerialPort serialPort, byte[] buffer, int index, int count, int timeout, bool wait, SerialLogFormat logFormat, out string logText) { int readCnt = 0; if (serialPort == null) { logText = ReadDataImpossible; } else { // данный способ чтения данных необходим для избежания исключения // System.ObjectDisposedException при прерывании потока линии связи DateTime nowDT = DateTime.Now; DateTime startDT = nowDT; DateTime stopDT = startDT.AddMilliseconds(timeout); serialPort.ReadTimeout = 0; while (readCnt < count && startDT <= nowDT && nowDT <= stopDT) { try { readCnt += serialPort.Read(buffer, index + readCnt, count - readCnt); } catch { /*The operation has timed out*/ } if (readCnt < count) Thread.Sleep(100); // накопление входных данных в буфере порта nowDT = DateTime.Now; } logText = ReceiveNotation + " (" + readCnt + "/" + count + "): " + (logFormat == SerialLogFormat.Hex ? BytesToHex(buffer, index, readCnt) : BytesToString(buffer, index, readCnt)); if (wait && startDT <= nowDT) { int delay = (int)(stopDT - nowDT).TotalMilliseconds; if (delay > 0) Thread.Sleep(delay); } } return readCnt; }