/// <summary> /// Calculate checksum, and append it at the end of message /// </summary> /// <returns></returns> public byte[] GetFinalCommandList() { var num = bl.Count; // First 2 bytes are skipped but checksum should be counted so overall length is unchanged, +2 - 2 = 0 bl.InsertRange(2, CustomConvertorClass.ConvertIntTo2Bytes(num)); UInt16 csum = ChecksumClass.CalculateChecksum(bl.ToArray()); bl.AddRange(CustomConvertorClass.ConvertIntTo2BytesBE(csum)); return(bl.ToArray()); }
private static void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { tempSerialReceiveBuff = new byte[serial.BytesToRead]; serial.Read(tempSerialReceiveBuff, 0, tempSerialReceiveBuff.Length); if (!Busy) { // Just ignore read data that we didnt asked for return; } switch (uartReceiver.CollectData(tempSerialReceiveBuff)) { case UARTResult.Done: taskState = 0; Running = 0; Busy = false; // All data collected, process it in a given success delegate if checksum matches ChecksumClass cs = new ChecksumClass(); if (cs.VerifyChecksumFromReceivedMessage(uartReceiver.bData)) { // Checksum match var dataWithoutChecksum = UARTHelperClass.RemoveChecksumFromMessage(uartReceiver.bData); uartReceiver.Reset(); FormCustomConsole.WriteLineWithConsole("Finished from DataReceived method"); _successCallback(dataWithoutChecksum); } else { if (_useRetry) { if (_retryCount >= _TOTAL_RETRY) { FormCustomConsole.WriteWithConsole("Aborting process (checksum doesnt match) at "); FormCustomConsole.WriteLineWithConsole(DateTime.Now.Minute + ":" + DateTime.Now.Second + ":" + DateTime.Now.Millisecond); Busy = false; _failCallback(); } else { // Leave busy flag we are not finished yet _retryCount++; _sleepBeforeRetry = 1; taskState = 2; } } else { // Checksum not valid Busy = false; _failCallback(); } } break; case UARTResult.WaitMoreData: Running = 1; break; case UARTResult.Error: default: uartReceiver.Reset(); Running = 0; throw new Exception("Error with UARTResult in SerialDriver.serialPort_DataReceived"); } }