串口通信
串口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);}}
}