Member 11985297 Ответов: 1

C#, событие serialport_datareceived() никогда не срабатывало для моего макетного интерфейса


Всем привет,

Я пытаюсь создать приложение, которое будет отправлять фиктивные данные на последовательный порт COM1, например строку "Привет".

Теперь это же приложение будет пытаться читать данные из того же COM1, то есть я хочу прочитать то же самое сообщение "Привет" из COM1. Для этого я написал код, но событие serialPort_DataReceived() никогда не срабатывает в моем приложении. Я не знаю, почему я могу прочитать данные из этого порта.

Неужели это невозможно или я что-то делаю не так?

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RS232MockInterface
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.Open();
            serialPort1.Handshake = System.IO.Ports.Handshake.None;
            serialPort1.DtrEnable = true;
            serialPort1.RtsEnable = true;
            serialPort1.ReadTimeout = 6000;
            serialPort1.WriteTimeout = 6000;
        }

        delegate void OutputUpdateDelegate(string data);

        private void OutputUpdateCallback(string data)
        {
            txtMessages.Text += data;
            //MessageBox.Show(data);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(!serialPort1.IsOpen)
            {
                serialPort1.Open();
                serialPort1.Handshake = System.IO.Ports.Handshake.None;
                serialPort1.DtrEnable = true;
                serialPort1.RtsEnable = true;
                serialPort1.ReadTimeout = 6000;
                serialPort1.WriteTimeout = 6000;
            }
            serialPort1.Write("Hi");
            string str = serialPort1.ReadExisting();
            //str = serialPort1.ReadLine();
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                String RecievedData;
                RecievedData = serialPort1.ReadExisting();
                if (!(RecievedData == ""))
                {
                    txtMessages.Invoke(new OutputUpdateDelegate(OutputUpdateCallback), RecievedData);
                }
              
            }
        }

        private void serialPort1_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
        {

        }

        private void serialPort1_PinChanged(object sender, System.IO.Ports.SerialPinChangedEventArgs e)
        {

        }
    }
}

1 Ответов

Рейтинг:
1

User 59241

Прежде чем вы пойдете дальше прочитайте это: Последовательная связь в C# для начинающих[^]. Есть приемный штифт и передающий штифт. Они не связаны между собой.

Вы можете сделать себе loopback адаптер для того, чтобы сделать тест loopback: Шлейф параллельно и усилитель компании PassMark; последовательный порт распиновки[^Для этого потребуется соединить вышеупомянутые контакты 2 и 3 вместе.

Теперь вы можете сделать некоторые тесты: Как сделать тест последовательной обратной связи - National Instruments[^]


Member 11985297

Спасибо за ссылки.

Один вопрос: почему во всех примерах последовательной связи используются пары портов (COM1 <--> COM2) для отправки и приема данных, а не только один порт (COM1)?

[no name]

Мой ответ говорит вам почему. В двух словах последовательный порт (UART) - это аппаратное устройство для связи между узлами, а не с самим собой. Таким образом, в любой полезной конфигурации вам нужны два UART. Прочтите статью Codeproject, прежде чем идти дальше.

Member 11985297

итак, должен ли я убедить себя, что я не могу читать и записывать данные, используя только один последовательный порт в моем макете приложения?

Member 11985297

Кроме того, не могу ли я сделать себе петлевой адаптер для моего фактически добавленного последовательного порта, а затем использовать свой существующий код? Если да, то какие изменения я должен внести?