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