Nishikant Tayade Ответов: 3

Отправка шестнадцатеричных данных в последовательный порт через C#


Я пытаюсь отправить шестнадцатеричные данные в последовательный порт, где я подключил регистратор данных, и ответ этого регистратора данных уже закодирован.
поэтому мне просто нужно отправить правильные шестнадцатеричные данные, чтобы получить этот вывод и отобразить его на консоли.

Код компилируется, но никаких данных не поступает.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SerialPortHexCommunication
{
    public class Program
    {
        static void Main(string[] args)
        {

            SerialPort port = new SerialPort();
            port.PortName = "COM5";
            port.Parity = Parity.None;
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.StopBits = StopBits.One;
           // port.Handshake = Handshake.RequestToSend;
           // port.ReceivedBytesThreshold = 8;
            if (port.IsOpen)

            {
                port.Close();
                port.Dispose();
            }
            
            byte[] bytesToSend = new byte[6] { 0xD0,0xF2,0xFF,0x00,0x06,0xC7 };  //$D0 $F2 $FF $00 $06 $C7
            port.Open();
             port.Write(bytesToSend,0,bytesToSend.Length);


         
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            port.Close();
            port.Dispose();

        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort port = (SerialPort)sender;

            int bytes = port.BytesToRead;
            byte[] buffer = new byte[bytes];

            if (port.BytesToRead > 1)
            {
              
                port.Read(buffer, 0, bytes);
            }

            foreach (byte item in buffer)
            {
                Console.WriteLine(item);
                Console.ReadKey();
            }

            //string indata = port.ReadExisting();
            //Console.WriteLine("Data received");
            //Console.WriteLine(indata);
            //Console.ReadKey();
        }
    }
}

0x01AA

Подумайте об этой последовательности:

port.Open();
port.Write(bytesToSend,0,bytesToSend.Length);

port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
port.Close();
port.Dispose();


Помимо всего прочего...
а) установите обработчик приема перед записью
б) вы пишете в порт и более или менее быстро закрываете порт. Это не сработает, по крайней мере, вам нужно дождаться ответа, прежде чем закрыть порт ;)

Nishikant Tayade

Я попробовал,но ничего не вышло.Не могли бы вы поподробнее?Это будет очень полезно

Nishikant Tayade

поэтому я попробовал еще раз, и он выдает результат 224.
Но когда я отправил тот же самый hex( $D0$F2$FF$00$06$C7) с терминалом, то он выдает Вывод Как E0 F2 01 00 3C 25 82 00 00 EA 95 20 01 2E 23 17 70 20 01 2C 23 17 70 20 01 36 23 17 70 20 01 2E 23 17 70 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 8F
это 224-Е0,но как насчет остального?

0x01AA

Что именно вы вводите в терминале?
Если вы наберете "$D0$F2$FF$00$06$C7", вам также нужно будет отправить ту же строку в свой код.В данный момент в вашем коде вы отправляете это как 6 байт, а не как шестнадцатеричные кодированные строки.

Вы можете попробовать/проверить это, когда отправляете точно такую же строку в своем коде, как вы отправляете ее с терминалом.

0x01AA

Кстати, еще одна вещь, из-за которой я столкнулся с большим количеством проблем на практике, и следующий прагматичный подход мне очень помог: перед закрытием порта я предлагаю сделать это port.DataReceived -= DataReceivedHandler;

Nishikant Tayade

Я сделал то,что вы сказали ранее,теперь программа компилируется и выполняется, но она показывает вывод только тогда, когда находится в режиме отладки, в противном случае она просто завершается после выполнения без какого-либо вывода на консоль.

0x01AA

Поставьте что-нибудь вроде этого Console.ReadKey(); в конце концов static void Main(string[] args), в противном случае вы не увидите вывода

Nishikant Tayade

Уже сделал это.Но все то же самое

0x01AA

Чтобы помочь вам, вы должны опубликовать свой пересмотренный код.

3 Ответов

Рейтинг:
16

0x01AA

Наконец я решил написать решение, может быть, больше ответ.
Пожалуйста, смотрите все комментарии, а также ответ @ppolymorphe

В случае, если вам интересны подробности, я предлагаю прочитать это от @glennPattonWork
Последовательная связь в C# для начинающих[^]


Рейтинг:
1

Nishikant Tayade

using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SerialPortHexCommunication
{
    public class Program
    {
        static void Main(string[] args)
        {

            SerialPort port = new SerialPort();
            port.PortName = "COM5";
            port.Parity = Parity.None;
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.StopBits = StopBits.One;
          
            if (port.IsOpen)

            {
                port.Close();
                port.Dispose();
            }
             port.Open();

            byte[] bytesToSend = new byte[6] { 0xD0, 0xF2, 0xFF, 0x00, 0x06, 0xC7 };

            port.Write(bytesToSend, 0, bytesToSend.Length);

          
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
           
            Console.ReadKey();
            port.Close();
            port.Dispose();

            
           

        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            Console.WriteLine("In data receive");
            SerialPort port = (SerialPort)sender;

            int bytes = port.BytesToRead;
            byte[] buffer = new byte[bytes];

            if (port.BytesToRead > 1)
            {
                port.Read(buffer, 0, bytes);
            }

            foreach (byte item in buffer)
            {
                Console.WriteLine(item);
               
            }

            //Console.ReadKey();
        }
    }
}


Рейтинг:
0

Patrice T

Цитата:
Код компилируется, но никаких данных не поступает.

Я боюсь, что ваша проблема заключается в том, что последовательный порт slooow, но вы закрываете порт сразу же после отправки ваших данных.
Вам нужно держать порт открытым, чтобы дать ему возможность получать данные от регистратора.

Поскольку последовательный порт работает медленно, обработчик будет вызван, поскольку данные все еще поступают от регистратора, прежде чем ответ будет завершен.
Это плохая идея, чтобы обработчик возился с консолью и ждал ввода пользователя.

Туто о последовательном порте доступны в интернете, вам нужно изучить принципы последовательного порта, потому что у вас есть еще одна проблема, ваш програзм закончен до получения ответа.
Ваша проблема заключается не только в коде для получения данных, но и во всей программе.


Nishikant Tayade

Я внес некоторые изменения, и теперь он показывает результат.Спасибо за ответ.

Patrice T

Добро пожаловать.
Если проблема решена, примите решение, чтобы закрыть вопрос, или опубликуйте свое собственное решение и примите его.
Если 0x01AA вам поможет, скажите ему, чтобы он опубликовал решение.

0x01AA

Я думаю, что ваш ответ довольно хорош, 5

Patrice T

Спасибо.
Я думаю, что Вы тоже тратите некоторые усилия, обсуждая с ОП

0x01AA

Это нормально, как это. Я делаю это в основном для того, чтобы тренировать свой старый (55 лет) мозг :-)

Patrice T

Мне столько же лет.
Я на самом деле тренирую свой мозг с этим: https://www.codeproject.com/Questions/1246743/Cutting-stock-optimization