C#串口通信Seriaport和页面传值

串口通信

串口COM:是一种用于连接计算机和外设设备的接口,也叫串行接口,简称com,常见的串口有一半电脑应用的RS-232(使用25针或9针的

连接器)通俗来讲串口就是usb接口、鼠标串口。键盘串口

串口通讯:是指外设和计算机 通过数据信号线、地线等按照一定协议进行双向通信的方式。

c# 通过SerialPort类获取串口相关的数据 并且提供发送和接收数据的方法,需要引入using System.IO.Ports;命名空间

桌面

namespace 串口通信例子SeriaPort
{
    public partial class Form1 : Form
    {
       //创建一个全局的串口对象
        readonly SerialPort port = new SerialPort();
        public Form1()
        {
            InitializeComponent();

            //对串口添加以下配置,

            // 1 BaudRate 波特率:用于描述通信枚每秒传递数据的速度
            //单位是bit/s, 常见的波特率1s是9600bit,1Byte是8bit  9600bit/8 = 1200字节,也就是1s发送1200个字节
            // 注意波特率不能太大 也不能太小, 如果太大了传输的数据不稳定,如果俩端的波特率不一致会导致数据不一致,如果太小了
            //反应太慢
            port.BaudRate = 9600; //设置波特率


            //2 StopBits 停止位 :标志着传输一个字符的结束
            // StopBits是一个枚举类型,可选择有1位 1.5位 2位,默认值是1位
            port.StopBits = StopBits.One;

            //3 DataBits 数据位:通信中真正的有效信息,数据位可以双方通过约定进行控制 一般可以5 、6 、7、8
            //默认值是8位
            port.DataBits = 8;


            //4 Parity 奇偶校检位 只占1位,指的是逻辑高位是奇数或者偶数个,高位就是1,低位是0
            //可取值有 Parity.None不采用校检
            //Parity.Odd  奇数校检,保证传输过程中高位个数是奇数个
            //Parity.Even 偶数校检, 保证传输过程中高位个数是偶数个
            port.Parity = Parity.None;


            //5 PortName设置连接串口名
            port.PortName = "COM1";

            //6 Encoding 编码格式,设置显示以什么格式显示
            //默认16进制格式
            port.Encoding = Encoding.Default;


            //必须配置的 波特率和设置串口
            //11 接收数据的事件 有数据触发这个函数
            port.DataReceived += Port_DataReceived;

        }
        bool isDefault = false;//代表编码方式 true代表默认默认编码
        private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //接收数据并且显示,
            //13BytesToRead 从缓存区读取数据的长度
            byte[] bs = new byte[port.BytesToRead];

            //14.Read从缓存区读取数据
            port.Read(bs, 0, bs.Length);//从缓存区读取数据

            //
            string value = null;
            //以哪种编码方式展示数据
            this.Invoke((EventHandler)delegate
            {
                if (isDefault)
                {
                    //16进制显示 item就是其中一个16进制
                    foreach (var item in bs)
                    {
                        value += " " + item.ToString("X"); //x代表16进制
                    }
                }
                else
                {
                    //GetEncoding("gb2312") 国标2312编码格式
                    value = Encoding.GetEncoding("gb2312").GetString(bs);
                }
                richTextBox1.Text += value + "\r\n";
                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                richTextBox1.ScrollToCaret();
                //15 DiscardInBuffer清空缓存区
                port.DiscardInBuffer(); //清空缓存区
            });


        }

        //打开串口
        private void button1_Click(object sender, EventArgs e)
        {
            //7IsOpen 当前串口是否是打开状态,
            // true 为打开状态
            //false 关闭状态
            if (!port.IsOpen) //没打开
            {
                //8 open 打开串口
                port.Open();
                //9 打开之后 要设置以下俩个属性为true
                //DtrEnable 为true,启用数据终端就绪,发送一个dtr信号。
                port.DtrEnable = true;

                //RtsEnable 为true 证明请求可以发送了,发送一个rts信号
                port.RtsEnable = true;
                button1.Text = "关闭串口";
            }
            else
            {
                button1.Text = "打开串口";

                //10 关闭串口
                port.Close();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] bs = Encoding.UTF8.GetBytes(this.textBox1.Text);
            //12Write 发送数据
            port.Write(bs, 0, bs.Length);
        }
    }
}

页面传值

①页面

namespace 页面传值
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //由Form1跳转Form2界面 把form1输入框内容传递form2的label,再把form2的输入框内容传递给form1
            //1从父级传递子级 可以通构造函数传参传递数据
            Form2 f2 = new Form2(this.textBox1.Text);
            f2.ShowDialog();

            //2 从子级传递父级界面 可以把子级的控件的modifiers属性修改成public ,在外=部进行访问
            //缺点 必须写在ShowDialog();后面
            this.textBox1.Text = f2.textBox1.Text;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form3 f3 = new Form3();
            f3.h1 += F3_h1;
            f3.ShowDialog();
        }

        private void F3_h1(string obj)
        {
            textBox2.Text = obj;

        }
        // 第二种父传子 子传父 
        //使用委托 ,可以在子级界面创建一个委托函数,在本界面给委托函数赋值,再子级界面调用


    }
}



②页面

public Form2(string s)
{
    InitializeComponent();
    this.label1.Text = s;
}

③页面

桌面只用放一个textbox

namespace 页面传值
{
    public partial class Form3 : Form
    {

        //定义事件
        public event Action<string> h1;
              
        public Form3()
        {
            InitializeComponent();
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            h1?.Invoke(textBox2.Text);
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值