C# проблема последовательной связи с микроконтроллером - PullRequest
0 голосов
/ 11 февраля 2020

У меня проблемы с последовательным соединением со встроенным устройством в среде Visual Studio C#, текущее решение состоит в том, чтобы связываться с сеансом замазки со следующими конфигами:

  • бод> 9600
  • биты данных> 8
  • стоп-биты> 1
  • четность> нет
  • управление потоком> RTS / CTS

Каждый раз соединение установлено, на терминале замазки отображается меню, в котором отображаются доступные команды контроллера.

Я пробовал следующее, которое позаимствовал из примера MS:


public class PortChat
{
    static bool _continue;
    static SerialPort _serialPort;

    public static void Main()
    {

        // Create a new SerialPort object with default settings.
        _serialPort = new SerialPort();

        _serialPort.PortName = "COM4";
        _serialPort.BaudRate = 9600;
        _serialPort.Parity = Parity.None;
        _serialPort.DataBits = 8;
        _serialPort.StopBits = StopBits.One;
        _serialPort.Handshake = Handshake.RequestToSend;


        // Set the read/write timeouts
        _serialPort.ReadTimeout = 5000;
        _serialPort.WriteTimeout = 5000;

        _serialPort.Open();
        Thread.Sleep(1000);
    }

}

Чтение из порт после «Port.Open» приводит к исключению, см. 1-й снимок экрана. Запись в порт также приводит к исключению, см. 2-й снимок экрана. Что мне здесь не хватает?

Спасибо

Read error

Write error

1 Ответ

1 голос
/ 13 февраля 2020

ReadLine ждет, пока не увидит строку SerialPort.NewLine. Если это не происходит в SerialPort.ReadTimeout, создается исключение TimeoutException. Либо увеличьте время ожидания, либо используйте ReadExisting().

См .: Выдача связи через последовательный порт TimeoutException

Для MSDN: [SerialPort.ReadTimeout] Gets or sets the number of milliseconds before a time-out occurs when a read operation does not finish.

См .: https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.readtimeout?view=netframework-4.8

By default, the ReadLine method will block until a line is received. If this behavior is undesirable, set the ReadTimeout property to any non-zero value to force the ReadLine method to throw a TimeoutException if a line is not available on the port.

См .: https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport.readline?view=netframework-4.8

...