本篇例子使用的虚拟串口转自这位博主:http://t.csdnimg.cn/LSGIs
串口COM: 是一种用于联接计算机和外设设备的接口,也叫串行接口,简称com,常见的串口有一般电脑应用的RS-232(使用25帧或者9帧的连接器) 通俗来讲串口就是usb接口、鼠标窗口。键盘串口
串口通讯: 是指外设和计算机 通过数据信号线、地线按照一定的协议进行双向通信的方式。
C# 通过SerialPort类获取串口相关的数据 并且提供发送和接收数据的方法 ,需要引用System.IO.Ports;命名空间
将虚拟串口安装完之后
添加COM1和COM2串口
这边XCOM选择一个串口
代码
搭建链接的界面
创建一个全局的串口对象
readonly SerialPort port = new SerialPort();
对串口添加一下配置:
波特率:用于描述通信每秒传递的数据的速度
单位是bit/s,常见的波特率是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.Even 偶数校检,保证传输过程中高位数是个偶数个
Parity.Odd 奇数校检,保证传输过程中高位个数是奇数个
port.Parity = Parity.None;
5 设置要连接的串口名
port.PortName = "COM1";
6 Encoding 编码格式设置显示以什么样的格式显示
默认16进制格式
port.Encoding = Encoding.Default;
打开串口按钮事件
private void button1_Click(object sender, EventArgs e)
{
// 7 IsOpen 当前串口
// 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();
}
}
11 接收数据事件 必须配置的是波特率和设置串口
port.DataReceived += Port_DataReceived;
Port_DataReceived方法
bool isDefault = true;// 代表编码方式 true代表默认默认编码
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 接收数据并且显示
// l3 BytesToWrite 从缓存区读取数据的长度
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 button3_Click(object sender, EventArgs e)
{
byte[] bs = Encoding.UTF8.GetBytes(this.textBox1.Text);
// 12Write 发送数据
port.Write(bs, 0, bs.Length);
}