У меня есть небольшое приложение, написанное на C#, которое прослушивает SerialPort для ввода информации. Информация поступает как: STX + data + ETX + BCC
. Затем мы вычисляем BCC пакета передачи и сравниваем. Функция:Почему вычисленная контрольная сумма не соответствует BCC, отправленной через последовательный порт?
private bool ConsistencyCheck(byte[] buffer)
{
byte expected = buffer[buffer.Length - 1];
byte actual = 0x00;
for (int i = 1; i < buffer.Length - 1; i++)
{
actual ^= buffer[i];
}
if ((expected & 0xFF) != (actual & 0xFF))
{
if (AppTools.Logger.IsDebugEnabled)
{
AppTools.Logger.Warn(String.Format("ConsistencyCheck failed: Expected: #{0} Got: #{1}", expected, actual));
}
}
return (expected & 0xFF) == (actual & 0xFF);
}
И это работает более или менее. Он точно не включает STX или BCC и точно включает ETX в его вычисления. Кажется, он работает очень большой процент времени, однако у нас есть по крайней мере две машины, на которых мы запускаем это, оба из которых - это 64-разрядная версия Windows 2008, в которой НИКОГДА не добавляется счет BCC. Вытягивание из недавнего журнала, которое было у меня в одном байте 20, было отправлено, и я вычислил 16 и один, где было отправлено 11, и я вычислил 27.
Я абсолютно зациклен на том, что происходит здесь. Возможно ли, что 64-битный или Windows 2008 «gotcha» мне здесь не хватает? Любая помощь или даже дикие идеи будут оценены.
EDIT:
Вот код, который считывает данные в:
private void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// Retrieve number of bytes in the buffer
int bytes = serialPort.BytesToRead;
// Create a byte array to hold the awaiting data
byte[] received = new byte[bytes];
//read the data and store it
serialPort.Read(received, 0, bytes);
DataReceived(received);
}
И функция DataReceived()
принимает эту строку и присоединяет его к глобальному StringBuilder
объекта. Затем он остается строковым построителем, пока он не будет передан этим различным функциям, после чего на него вызывается .ToString()
.
EDIT2: Изменен код, который отражает мои измененные процедуры, которые работают с байтами/байтовыми массивами, а не с строками.
EDIT3: Я до сих пор не понял этого, и у меня появилось больше тестовых данных, которые имеют совершенно непоследовательные результаты (количество, которое я выхожу из контрольной суммы отправки, меняется каждый раз без шаблона). Похоже, я просто неправильно подсчитываю контрольную сумму, но я не знаю, как это сделать.
Похоже, вы все еще не уверены в том, связана ли проблема с последовательным портом, принимающим весь пакет или вычислением BCC. Можете ли вы написать небольшую автономную программу, которая считывает данные из файла журнала с известного хорошего компьютера, а затем вызывает «DataReceived» и выполняет всю последующую обработку? Если вы можете запустить это на одном из 64-битных «плохих» компьютеров Win2008, вы можете знать, где искать дальше. – mtrw