Обновление
Оказывается, ошибка была в коде криптопроцессора, который исправлен.Но теперь мы сталкиваемся с тем, что кажется, что это проблема рукопожатия.
При первой передаче мы получаем один байт от устройства со значением 0xFF (не знаю почему, инженер, с которым я работаюне слишком опытен с RS-232).Затем все работает как обычно (просто отправляя устройство по одному байту за раз и ожидая соответствующего эха).Однако ни устройство, ни приложение .NET не могут отправлять более пары байтов за раз, прежде чем один из них заблокируется и откажется отправлять или получать.
На работе я пишуприложение, которое взаимодействует через RS232 с криптопроцессором внутри устройства для перепрограммирования флеш-модулей внутри устройства.
Чтобы сделать все медленно и убедиться, что все наши заголовки верны, мы пишем по одному байту за раз сSerialPort.Write ().Однако, когда мы запускаем код на криптопроцессоре, он читает дополнительный NULL между каждым байтом.Когда я тестирую код .NET на моей локальной машине с двумя последовательными портами и перекрестным кабелем, я записываю выходные данные в HyperTerminal или Putty, и при просмотре журнала в Notepad ++ никаких дополнительных NULL нет.
Однакочтобы еще больше усложнить ситуацию, когда мы вручную набираем сообщения побайтно через HyperTerminal для криптопроцессора, он считывает входные данные только как один байт, без дополнительных NULL (по сравнению с приложением .NET).У кого-нибудь есть опыт работы с .NET таинственными вещами, когда он пишет в SerialPort?
Мы инициализируем тестовый блок с этим:
byte[] testBytes = new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', (byte)'H' };
byte[] byteArray = new byte[256];
for (int i = 0; i < 32; i++)
{
testBytes.CopyTo(byteArray, i * 8);
}
И отправляем его с этим:
public void StutterSend(byte[] data, long delayMs)
{
bool interactive = false;
if (delayMs < 0)
interactive = true;
for (int i = 0; i < data.Length; i++)
{
serialPort.Write(data, i, 1);
if (interactive)
{
WriteLine("Sent byte " + (i + 1) + " of " + data.Length + ". Press any key to send moar.");
Console.ReadKey();
}
else
{
double timer = DateTime.Now.TimeOfDay.TotalMilliseconds;
do { } while ((DateTime.Now.TimeOfDay.TotalMilliseconds - timer) < delayMs);
}
}
WriteLine("Done sending bytes.");
}
Наш SerialPort сконфигурирован со всеми соответствующими параметрами (стоп-биты, биты данных, четность, скорость передачи в бодах, имя порта), и наше рукопожатие установлено на Нет (именно так работает наш драйвер uart).