c# - 在windows窗体应用程序中从串口接收数据

原文 标签 c# winforms serial-port

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 WindowsFormsApp7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            getavaialbleports();
        }

        void getavaialbleports()
        {
            String[] ports = SerialPort.GetPortNames();
            comboBox1.Items.AddRange(ports);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (comboBox1.Text == "" || comboBox2.Text == "")
                {
                    textBox2.Text = "Please select port settings";
                }
                else
                {
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
                    serialPort1.Open();
                    button1.Enabled = false;
                }
            }

            catch(UnauthorizedAccessException)
            {
                textBox2.Text = "Unauthorised Access";
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            serialPort1.WriteLine(textBox1.Text);
            textBox1.Text = "";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = serialPort1.ReadLine();
        }        
    }
}

我可以从上面的代码发送数据,但对于接收,我无法从中读取数据。没有构建错误。请帮我解决这个问题。

最佳答案

您可以实现“SerialPortDataReceivedEvent”从串口读取数据。
在使用“DataReceivedEvent”打开与串口寄存器的连接之前,里面
button1_Click 事件添加以下代码。

serialPort1.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived);

然后添加下面的事件处理程序
private static void mySerialPort_DataReceived(
                    object sender,
                    SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    //data received on serial port is asssigned to "indata" string
    //Console.WriteLine("Received data:");
    //Console.Write(indata);
}

此外,尝试配置其他属性,如 Parity、StopBits、DataBits 等,类似于另一端的设备(您正在尝试与之通信)。

更新 UI 上的数据:
您需要的是设置 Text 的委托(delegate)方法。具有给定字符串的文本框的属性。然后您从您的 mySerialPort_DataReceived 中调用该委托(delegate)。处理程序通过 TextBox.Invoke()方法。像这样的东西:
public delegate void AddDataDelegate(String myString);
public AddDataDelegate myDelegate;

private void Form1_Load(object sender, EventArgs e)
{
  //...
  this.myDelegate = new AddDataDelegate(AddDataMethod);
}

public void AddDataMethod(String myString)
{
 textbox1.AppendText(myString);
}

private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
 SerialPort sp = (SerialPort)sender;
 string indata = sp.ReadExisting();

 textbox1.Invoke(this.myDelegate, new Object[] {indata});       
}

如果您需要进一步说明,请告诉我们。

希望这可以帮助..

关于c# - 在windows窗体应用程序中从串口接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44069749/

相关文章:

c# - 使用DataGridView从另一个表单在TextBox中显示数据库信息

c - 通过C中的UDP套接字的串行接口(interface)

c# - 函数 : Calculating velocity, 时间、距离( double 型变量)

c# - 如何通过网络访问在远程计算机上运行的API

c# - 如何从 C# 中的 async task<bool> 函数获取 bool 结果 - 错误 : Cannot implicitly convert type `void' to `bool'

c# - C#Windows窗体倒数计时器

c# - 深度克隆对象

c# - 同时自动检测COM-Port和WriteLine

delphi - 用户 GUI Activity 如何破坏我的串行端口输入

C# SerialPort - 混合具有不同波特率的端口时出现问题