【问题标题】:Assistance with SerialPort monitoring (C# Winforms) [duplicate]协助 SerialPort 监控(C# Winforms)[重复]
【发布时间】:2019-10-05 22:05:06
【问题描述】:

我正在尝试开发一款可以监听并与串行端口(COM3、COM5 等)对话的软件。文件“form1.cs”被复制并粘贴在下面。

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;
using System.IO.Ports;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        string DispString;
        public Form1()
        {
            InitializeComponent();
        }

        private void StartCOM1(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM1";
            StartCOM_General();
        }

        private void StartCOM3(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM3";
            StartCOM_General();
        }

        public void StartCOM_General()
        {
            serialPort1.BaudRate = 115200;
            serialPort1.Parity = Parity.None;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Handshake = Handshake.None;
            try { serialPort1.Open(); } finally{ }
            serialPort1.ReadTimeout = 2000;
            if (serialPort1.IsOpen)
            {
                DispString = "";
            }
        }

        private void ResetClosePort(object sender, EventArgs e)
        {
            DispString = "";
            textBox1.Text = "";
            serialPort1.Close();
        }

        private void UpdateData(object sender, SerialDataReceivedEventArgs e)
        {
            DispString += serialPort1.ReadExisting();
            textBox1.Text = DispString;
        }
    }
}

我的问题是我的端口没有显示任何内容。即使我的 serialPort 对象的“DataReceived”事件设置为调用 UpdateData,我认为根本不会调用 UpdateData。

这是表单的图像,其中为 serialPort1 打开了事件选项卡。

【问题讨论】:

  • 这张图片根本没有为问题添加任何内容。你也没有把事件联系起来。也许你应该稍微了解一下事件
  • 请阅读SerialPort.DataReceived documentation中有关线程问题的部分

标签: c# winforms


【解决方案1】:

SerialPort.DataReceived documentation 中所述,事件在辅助线程上发出信号。因此,您必须使用 Control.Invoke 正确编组回 UI 线程,例如:

    private void UpdateData(object sender, SerialDataReceivedEventArgs e)
    {
        DispString += serialPort1.ReadExisting();
        textBox1.Invoke((MethodInvoker)(() => textBox1.Text = DispString));
    }

【讨论】:

    【解决方案2】:

    你可以检查

    MessageBox.Show("Data recieved!");
    

    在 UpdateData(..) 中查看是否调用了 UpdateData。
    如果是可能尝试更换

    DispString += serialPort1.ReadExisting();
    

    SerialPort sp = (SerialPort)sender;
    DispString += sp.ReadExisting();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2013-11-16
      • 1970-01-01
      相关资源
      最近更新 更多