У меня есть небольшое приложение, написанное на C #, которое прослушивает SerialPort для получения информации. Информация приходит как: STX + data + ETX + 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 "ошибки"? Любая помощь или даже дикие идеи будут оценены.
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: изменен код для отображения моих измененных подпрограмм, которые работают с байтами / байтовыми массивами, а не со строками.
РЕДАКТИРОВАТЬ3: Я до сих пор не понял этого, и я получил больше тестовых данных, которые имеют совершенно противоречивые результаты (сумма, которую я вычеркиваю из контрольной суммы отправки, меняется каждый раз без шаблона). Такое ощущение, что я просто неправильно вычисляю контрольную сумму, но я не знаю как.