C#串口通讯详解(SerialPort类实现)

在这里插入图片描述

最终效果
在这里插入图片描述
窗体设置:
在这里插入图片描述

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

namespace SerialCommunication
{
    public partial class Form1 : Form
    {
        System.Threading.SynchronizationContext m_SyncContext = null;
        SerialPort serialPort = null;
        ToHexadecimalString toHexadecimalString = new ToHexadecimalString();
        public Form1()
        {
            m_SyncContext = SynchronizationContext.Current;
            InitializeComponent();
        }

        //Data initialization
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            SerialPortNumber.Items.AddRange(ports);
            SerialPortNumber.SelectedIndex = SerialPortNumber.Items.Count > 0 ? 0 : -1;
            BaudRateCom.Text = "9600";  //Set parameters
            CheckBitCom.Text = "None";
            DataBitCom.Text = "8";
            StopBitCom.Text = "One";
        }

            //Send data
         private void Send_Click(object sender, EventArgs e)
        {
            try
            {
                //Send data and handle exceptions
                byte[] bytes = new byte[SendMessage.Text.Length];
                bytes = Encoding.Default.GetBytes(SendMessage.Text);
                serialPort.Write(bytes, 0, bytes.Length);
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }
        }
                // Byte to hexadecimal string 

        //Clear data
        private void Clear_Click(object sender, EventArgs e)
        {
            ReceiveMessage.Text = "";
        }

        private void Open_Click(object sender, EventArgs e)
        {
            string portName = SerialPortNumber.Text;
            int buadRate = int.Parse(BaudRateCom.Text);
            Parity parity = 0;
            switch (CheckBitCom.Text)
            {
                case "None":
                    parity = Parity.None; break;
                case "Odd":
                    parity = Parity.Odd; break;
                case "Even":
                    parity = Parity.Even; break;
                case "Mark":
                    parity = Parity.Mark; break;
                case "Space":
                    parity = Parity.Space; break;
            }
            int dataBit = int.Parse(DataBitCom.Text);
            StopBits stopBits = 0;
            switch (StopBitCom.Text)
            {
                case "None":
                    stopBits = StopBits.None; break;
                case "One":
                    stopBits = StopBits.One; break;
                case "Tow":
                    stopBits = StopBits.Two; break;
                case "OnePointFive":
                    stopBits = StopBits.OnePointFive; break;
            }
            try
            {
                if (Open.Text == "Open")
                {
                    serialPort = new SerialPort(portName, buadRate, parity, dataBit, stopBits);
                    serialPort.Open();
                    Open.Text = "Close";
                }
                else if (Open.Text == "Close")
                {
                    serialPort.Close();
                    Open.Text = "Open";
                }
            }
            catch (Exception errror)
            {
                MessageBox.Show(errror.Message);
            }
            serialPort.DataReceived += onDataReceived;

        }
        private void onDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                Byte[] bytes = new byte[serialPort.BytesToRead];
                serialPort.Read(bytes, 0, serialPort.BytesToRead);
                m_SyncContext.Post(new SendOrPostCallback((obj) =>
                {
                    ReceiveMessage.AppendText(Encoding.Default.GetString(bytes));
                }), bytes);
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }
        }
    }
}

### 回答1: omputer (计算机) 之间的通信是如何实现的。 三菱PLC与计算机之间的通信是通过串行通信或以太网通信来实现的。 在串行通信方面,三菱PLC通常使用RS485或RS232等接口与计算机连接。通过串行通信协议,PLC与计算机之间可以进行数据的传输和控制命令的交互。计算机可以通过串口将数据发送给PLC,PLC接收到数据后进行处理,并根据指令执行相应的操作。同时,PLC也可以将采集到的数据发送给计算机进行分析和监控。 在以太网通信方面,三菱PLC可以通过以太网接口与计算机建立连接。通过TCP/IP协议栈,PLC与计算机之间可以进行高速的数据传输和实时的控制命令交互。计算机可以通过以太网将数据发送给PLC,PLC接收到数据后进行处理,并根据指令执行相应的操作。同时,PLC也可以将采集到的数据通过以太网发送给计算机进行分析和监控。 在通信过程中,三菱PLC和计算机需要事先配置好通信参数,例如波特率、数据位、校验位等,以确保双方的通信能够顺利进行。此外,通信过程中也需要遵循一定的通信协议和通信规范,以保证数据的正确传输和命令的正确执行。 总而言之,三菱PLC与计算机之间的通信可以通过串行通信或以太网通信实现,通过数据传输和控制命令交互,实现实时的控制和监控。 ### 回答2: 三菱PLC与C是工业自动化领域中常用的控制设备。PLC(可编程逻辑控制器)是一种计算机控制器,广泛应用于自动化系统中,用于控制和监测各种自动化设备和机器。三菱PLC是以三菱电机公司的品牌命名的PLC。 三菱PLC具有以下几个特点和优势: 1. 高可靠性:三菱PLC经过严格的测试和验证,具有高可靠性和稳定性,能够在恶劣的工作环境下长时间稳定运行。 2. 强大的功能:三菱PLC具有丰富的功能模块和通信接口,可以满足各种复杂的工业自动化需求。 3. 灵活性:三菱PLC具有灵活的编程和配置选项,可以根据具体的应用场景进行定制,满足不同需求。 4. 易于维护:三菱PLC具有友好的接口和操作界面,便于用户进行调试、维护和故障排除。 C是一个通信协议,常用于连接PLC和上位机之间的数据传输。C协议有多种版本,例如CIP(Common Industrial Protocol)、CIMPLICITY等,它们都是基于以太网的通信协议。 通过C协议,上位机可以与PLC进行实时数据的交互和控制指令的传输,实现对PLC系统的监测和调控。C协议具有高效、稳定和可靠的特点,被广泛应用于工业自动化领域。 三菱PLC与C协议的结合,可以实现工业自动化系统中的集中控制和数据传输。PLC作为控制设备,通过C协议与上位机连接,实现与其他设备的数据交换和监测,同时接收上位机发送的控制指令,按照预设的逻辑进行相应的动作。这种集中化的控制方式提高了生产过程的自动化程度,提高了生产效率和质量。 ### 回答3: NC (Numerical Control) 是数字控制的缩写,是一种应用于机床、工业机械和自动化装置中的控制系统。而PLC (Programmable Logic Controller) 是可编程逻辑控制器的缩写,是一种广泛应用于工业自动化领域的控制设备。 三菱PLC与CNC在使用上有一些区别。PLC主要用于控制工艺过程,例如传送带、升降机、机械臂等,可以通过程序逻辑控制设备的运行。而CNC主要用于机床等工艺设备,通过程序控制工件在空间中进行加工和加工参数的调整。 在功能上,PLC擅长处理多个输入输出,具备计时控制、计数控制、逻辑控制和数据处理等功能。而CNC则主要进行数控加工,具备控制坐标轴、速度控制、插补运动等数控功能。 在编程方面,PLC使用逻辑图、函数图、梯形图等编程方式,较为易学易懂,适用于非专业程序员。而CNC则需要使用G代码进行编程,需要掌握专业的数控编程知识。 另外,三菱是PLC和CNC领域的知名厂商,其PLC和CNC设备具有高性能、可靠性和稳定性,并且有丰富的应用案例和完善的技术支持。 综上所述,三菱PLC和CNC在功能和应用领域有所不同,但都是工业自动化领域中非常重要的控制设备。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值