private byte[] createRespondMessage() { int numberOfPoints = 0; int bytesToSend = 0; int startAddress = 0; numberOfPoints = (_messageReceived[4] << 8) | _messageReceived[5]; bytesToSend = 5 * numberOfPoints + 2; byte[] respondMessage = new byte[bytesToSend]; respondMessage[0] = _slaveAddress; respondMessage[1] = 3; respondMessage[2] = Convert.ToByte(2 * numberOfPoints); startAddress = (_messageReceived[2] << 8) | _messageReceived[3]; int j = 0; for (int i = 0; i < numberOfPoints; i++) { respondMessage[i + j + 3] = Convert.ToByte((_registerData[startAddress + i] >> 8) & 0xff); respondMessage[i + j + 4] = Convert.ToByte(_registerData[startAddress + i] & 0xff); j++; } byte[] crcCalculation = CRCStuff.calculateCRC(ref respondMessage, bytesToSend - 2); respondMessage[bytesToSend - 2] = crcCalculation[0]; respondMessage[bytesToSend - 1] = crcCalculation[1]; return(respondMessage); }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; while (!worker.CancellationPending) { if (_serialPort.BytesToRead == 8) { _serialPort.Read(_messageReceived, 0, 8); addLog(createLogStr(ref _messageReceived), LogType.RX, worker); if (_messageReceived[0] == _slaveAddress && _messageReceived[1] == 3) { if (CRCStuff.checkCRC(ref _messageReceived, 8)) { byte[] messageToSend = createRespondMessage(); System.Threading.Thread.Sleep(_slaveDelay); _serialPort.Write(messageToSend, 0, messageToSend.Length); addLog(createLogStr(ref messageToSend), LogType.TX, worker); } else { addLog("", LogType.CRC_ERR, worker); } } } else { _serialPort.DiscardInBuffer(); } } _serialPort.Close(); e.Cancel = true; }