Задать вопрос
@andrey71
админю и учу C#, ASP.NET Core

Есть ли нюансы в работе с COM портом на c#?

Пытаюсь работать с двумя ком портами на c# WPF. Написал простенькое приложение, в котором читаю одновременно два ком порта. К одному COM3 подключено Arduino UNO, к другому COM6 - Arduino Pro Micro.
С Уно проблем нет.
С Микро - тишина. Менял местами - результат 0.
Если подключится к Микро с помощью putty, то видно что данные передаются.
Но в приложении их не видно.

Куда копать?

Мой код:
public partial class MainWindow : Window
    {
        private SerialPort serialPortCmd;
        private SerialPort serialPortData;
              
       

        public string Weigth { get; set; }

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {             
            //ReadFromSerailPortC();
            ReadFromSerailPortD();
        }

        private void ReadFromSerailPortC()
        {            
            serialPortCmd = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
            serialPortCmd.DataReceived += new  SerialDataReceivedEventHandler(DataReceirvedCmd);
            serialPortCmd.Open();            
        }

        private void DataReceirvedCmd(object sender, SerialDataReceivedEventArgs e)
        {
            string _message = null;
            serialPortCmd = (SerialPort)sender;
            _message = serialPortCmd.ReadLine();
            System.Diagnostics.Debug.WriteLine(_message);
        }

        private void ReadFromSerailPortD()
        {
            serialPortData = new SerialPort("COM6", 9600, Parity.None, 8, StopBits.One);
            serialPortData.DataReceived += new SerialDataReceivedEventHandler(DataReceirvedDt);
            serialPortData.Open();
        }

        private void DataReceirvedDt(object sender, SerialDataReceivedEventArgs e)
        {
            string _message = null;
            serialPortData = (SerialPort)sender;
            _message = serialPortData.ReadLine();
            System.Diagnostics.Debug.WriteLine(_message);
        }
  • Вопрос задан
  • 256 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@GREGOR_812
Не уверен, что вопрос ещё актуален, но на всякий случай выскажу свои мысли:

1. Возможно, ваш девайс присылает слишком короткое сообщение и ждёт ответа. Чтобы это проверить/исправить, вы можете поиграть с порогом ReceivedBytesThreshold, которые есть у типа SerialPort. Это порог по кол-ву данных в буфере чтения, по достижению которого будет срабатывать событие DataReceived, на которое вы подписались. Поставьте брейкпойнт на строке string _message = null; в обработчике DataReceirvedDt и проверьте, вызывается ли вообще этот обработчик для ардуины про. Если нет, значит, нужно уменьшать порог.

2. Если же с порогом всё ок, то идём дальше. В обработчике При чтении методом ReadLine() нужно быть точно уверенным, что у вашего хоста и ардуины про одинаковые символы окончания строки. Для хоста это можно настроить через свойство NewLine в классе SerialPort. Судя по коду, у вас хост под виндой, значит, окончание строки у вас может отличаться от того, что присылает ардуина. Если они не совпадают, то метод не может найти окончания строки и блокируется. Чтобы это проверить, можно поставить брейкпойнт на строку _message = serialPortData.ReadLine(); и выполнить его кнопкой StepOver в отладке. Если данные будут получены, значит окончание строки на хосте и ардуине интерпретируется одинаково, если метод заблокируется, значит, либо в полученных данных вообще нет символов конца строки, либо они различаются у хоста и ардуины.
Ответ написан
Комментировать
Зачем вы закоментили
ReadFromSerailPortC()
private void Window_Loaded(object sender, RoutedEventArgs e)
        {             
            //ReadFromSerailPortC();
            ReadFromSerailPortD();
        }
?
Также посоветую сделать так:
while(serialPortData.isOpen!=true){//открывать порт пока он не откроется
serialPortData.Open();
}

возможно, на плату не успеваит дойти сигнал с порта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы