Все еще не уверен, что заголовок для этого вопроса ...
Я использую .Net Framework, используя serialPort.ReadExisting()
(который возвращает строку), а не serialPort.Read()
(которыйвозвращает байтовый массив). Я делаю это потому, что serialPort.ReadExisting()
дает мне доступ к данным потока, которые еще не находятся в буфере, вместе с буфером SerialPort. Однако этот метод требует, чтобы я считывал данные в виде строки, но, похоже, нет способа сообщить последовательному порту «Привет, используйте кодировку base64», и вместо этого я могу выбрать ASCII, UTF8 и т. Д. serialPort.Encoding = Encoding.ASCII;
. Теперь я знаю, что мои данные не проблема, потому что этот ТЕСТ работает:
string a = Convert.ToBase64String(transmitBytes, Base64FormattingOptions.None);
byte[] b = Convert.FromBase64String(a);
SHA256 sha256 = SHA256.Create();
byte[] hash1 = sha256.ComputeHash(transmitBytes);
byte[] hash2 = sha256.ComputeHash(b);
if (CompareHash(hash1, hash2))
Console.WriteLine("good check");
}
private static bool CompareHash(byte[] a1, byte[] a2)
{
for (int i = 0; i < a1.Length; i++)
{
if (a1[i] != a2[i])
return false;
}
return true;
}
Но если я отправляю свои данные по проводам, у меня возникают проблемы. Моя теория состоит в том, что это происходит потому, что метод ReadExisting () пытается прочитать биты как 7-битные значения ascii, и многие части данных будут вне диапазона 6-битовых символов base64: такие вещи, как [
, _
и|
может вызвать проблему, которая может возникнуть, если принимающая сторона пытается прочитать 7 бит, а не 6.
Я попытался настроить последовательную связь в среде с низким уровнем шума, и я 'мы пробовали несколько комбинаций длин данных для отправки на последовательное сообщение.
Ниже приведен соответствующий код, вызывающий нарушение (последняя строка выдает исключение):
// sending machine is working I think
serialPort.DataBits = 8; //also tried (6 and 7) many many times)
_serialPort.Write(Convert.ToBase64String(transmitBytes, Base64FormattingOptions.None));
// receiver machine is trowing the format exception
serialPort.DataBits = 8; // also tried (6 and 7) many many times)
byte[] BigBuffer = new byte[_serialPort.ReadBufferSize];
// read data then discard buffer to get new data from the transmitting machine
BigBuffer = Convert.FromBase64String(_serialPort.ReadExisting()); // throws exception
Любая идея, как я могу отлаживать, и, надеюсь,исправить то, что происходит? Я не хочу прибегать к serialPort.Read ()
exception.Message = "The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters."
Дополнительный тестовый сценарий: я отправил небольшую нереалистичную строку значений для целей отладки и получил то же исключение. Я ДОЛЖЕН ИМЕТЬ ПЕРЕДАЧУ ПЕРЕДАТЧИКА ЕГО ОТПРАВЛЯТЬ, ПОЭТОМУ ОНА ОТПРАВЛЯЕТ ЭТО ЗНАЧЕНИЕ НЕСКОЛЬКО РАЗ, ПРЕЖДЕ ЧЕМ ПРИЕМЧИК ХИТ ИСКЛЮЧЕНИЕ. Вот исходная строка base64:
utz+EDJUdpgLAAAATG9yZSBpbXBzdW3UAPpp4FQlifaZAzUzyh25062szzbhSyVs3ehe6nU+UYlnRSMB782r
Вот строка, полученная от ReadExisting () (я предполагаю, что это ASCII, поскольку serialPort установлен в кодировку ASCII). Эта строка вызывает исключение при передаче в Convert.FromBase64String ()
dW3UAPpp4FQlifaZAzUzyh25062szzbhSyVs3ehe6nU+UYlnRSMB782rutz+EDJUdpgLAAAATG9yZSBpbXBzdW3UAPpp4FQlifaZAzUzyh25062szzbhSyVs3ehe6nU+UYlnRSMB782rutz+EDJUdpgLAAAATG9yZSBpbXBzdW3UAPpp4FQlifaZAzUzyh25062szzbhSyVs3ehe6nU+UYlnR