У меня есть микроконтроллер (Arduino Uno), работающий nanopb, который отправляет сообщения protobuf по проводу. Я нахожу, что в одном конкретном случае я не получаю свое полное сообщение. Некоторое время я думал, что это микроконтроллер, но, похоже, он находится на стороне C#, которая читает его.Последовательный порт не читает все данные
Проблема ТОЛЬКО для значений uint32 БОЛЬШЕ, ЧЕМ 16. 16 или менее, и работает нормально.
Я установил ОЧЕНЬ простую программу на микроконтроллере, чтобы убедиться, что это не мой другой код, вызывающий его. По сути, это посылает на структуру на провод с одним значением uint32_t в нем:
//Protobuf message:
message Test { required uint32 testInt = 1 }
//Resulting struct:
typedef struct Test {
uint32_t testInt;
}
//Serial code:
Serial.begin(115200);
pb_ostream_t ostream;
//Removed ostream setup code as it's not relevant here...
Test message;
Test.testInt = 17;
pb_encode_delimited(&ostream, Test_fields, &message);
Если я включаю в устройстве и посмотреть на это выходные данные с помощью Termite я вижу следующие данные (что правильно):
[02] [08] [11] (note Termite displays it in hex)
(это говорит сообщение длиной 2 байта, а затем стартовым тзд байт, за которым следует значение Test.testInt 17 - 0x11 в шестнадцатеричной)
Теперь, если я поднимаю это в C# я см. 3 байта при чтении сообщения, но я вижу только 2. Когда va LUE в testInt составляет 16 или менее попадается, как три байта, 17 или более, и я получаю только два:
var port = new SerialPort("COM7", 115200, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.RequestToSendXOnXOff;
port.Open();
while (port.IsOpen)
{
Console.WriteLine(port.ReadByte());
Thread.Sleep(10);
}
port.Close();
Console.ReadLine();
Output with 16: 2 8 16
Output with 17: 2 8 17
Любая помощь очень ценится, я теряюсь в этот = (
BINGO - geez, который заставлял меня BONKERS ... Я использовал Xon/Xoff для установления связи, но он выглядит например, мне нужно использовать другой процесс, а не –
Да, никто не использовал Xon/XOff, так как мы перестали использовать телетайпы :) 'serialPort.RtsEnable = true' - это то, что я использовал с моими устройствами Arduino. –
Если вам требуется управление потоком, и вы не можете использовать рукопожатие HW, то (с дополнительными усилиями) XON/XOFF все еще можно использовать с двоичными данными, но вам нужен метод * вылета * значений данных 0x11 и 0x13. – sawdust