C# пример связи через последовательный порт - PullRequest
0 голосов
/ 01 апреля 2020

Я бродил, если это возможно (и это хорошо реализовано), мой следующий вопрос:

Я хочу поговорить с PL C через последовательную связь. Каждый раз, когда я отправляю данные на PL C, он отправляет мне данные обратно, и мы не знаем, сколько времени ему потребуется, чтобы отправить меня обратно (несколько миллисекунд, но не сколько).

Я хотел создать класс для последовательной связи (между P C и PL C) с разделенными методами:

  1. Open () -> Открывает последовательную связь с PL C
  2. Talk2PL C () -> Отправляет данные на PL C и ожидает получения данных назад и их чтения
  3. Закрыть ( ) -> Закрыть последовательную связь с PL C

Как это будет работать: Когда проект запускается, мы открываем последовательную связь с PL C. Тогда во время выполнения программы мы будем использовать только Talk2PL C () для связи с PL C, мы будем вызывать этот метод несколько раз. Когда данные из PL C будут получены, они будут обработаны в ProcessData (). Когда вся работа будет завершена, мы закроем связь с PL C, вызовем Close ().

   !!It's import methods are separated¡¡

Вопросы:

  • Будет ли это работать хорошо, как я, даже если «открыть» и «закрыть» разделены?

  • В Talk2PL C () я смогу читать данные, отправленные обратно из PL C даже если ответ не мгновенный? Нужна ли какая-то задержка на случай, если мне нужно подождать? Мой обработчик событий com_Datareceive () сможет прочитать его? Думаю, что «ReadTimeout» и «WriteTimeout» должны помочь.

  • После того, как я вызову Open () и затем вызову Talk2PL C () в первый раз, в следующий раз я позвоню Talk2PL C () смогу ли я отправлять и получать данные с PL C?

a

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

namespace Project
{
    class Serial
    {
        // Serial port settings.
        SerialPort com = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

        List<byte> PlcBuffer = new List<byte>();

        // Open serial communication with PLC.
        public void Open()
        {
            com.Open();          
        }

        /* Query PLC and get answer.
         * @cmd: command to be send.
         */
        public void Talk2PLC(byte[] cmd)
        {

            PlcBuffer.Clear();//Clear previous data before storing new one.
            // Set the read/write timeouts
            com.ReadTimeout = 1000;
            com.WriteTimeout = 1000;

            //Write. Send data to PLC
            com.Write(cmd, 0, cmd.Length);
            //Read. Wait for an answer from PLC.
            com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
        }

        // Gets all data send by the PLC.
        public void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Buffer and process binary data
            while (com.BytesToRead > 0)
                PlcBuffer.Add((byte)com.ReadByte());

            ProcessData(PlcBuffer);   //Send data to be processed
        }//End com_DataReceived()

        // This will process data from PLC
        public void ProcessData(List<byte> buffer)
        {
            //Process data
        }

        // Close serial communication with PLC.
        public void Close()
        {
                com.Close();
        }

    }
}

Спасибо всем, кто прочитал все и попытался помочь :)

...