📄 frmserialport.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace SerialPortTest
{
public partial class frmSerialPort : Form
{
private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };//显示的字体颜色
public frmSerialPort()//页面初始化
{
InitializeComponent();
//InitializeControlValues();//串口初始化
//comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
}
private void InitializeControlValues()//串口初始化
{
try
{
comport.PortName = "COM1";//端口号
comport.BaudRate = 9600;//波特率
comport.DataBits = 8; //数据位
comport.Parity = System.IO.Ports.Parity.None;//奇偶验检位
comport.StopBits = System.IO.Ports.StopBits.One;//停止位
comport.Open();
}
catch (Exception ex)
{
MessageBox.Show("初始化串口失败,串口正被使用,\n\n出现错误:\n" + ex.Message, "警告信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
comport.Close();
}
}
private void frmTerminal_Shown(object sender, EventArgs e)//版权
{
Log(LogMsgType.Normal, String.Format(" Autumn: Application Started at {0}\n", DateTime.Now));
}
#region 数据接收格式
private void port_DataReceived1(object sender, SerialDataReceivedEventArgs e)//接收(仪表 1)
{
try
{
string data = comport.ReadExisting();//获得串口传来的数据
System.Threading.Thread.Sleep(600);// sleep 100ms to send data
if(data.Length>10)//判断长度
{
string rr;
int ss;
rr = data.Substring(3, 7);
#region 去除小数点
if (rr.Substring(6, 1) == ".")
{
rr = data.Substring(3, 6);
ss = int.Parse(rr.ToString());
}
else if (rr.Substring(5, 1) == ".")
{
rr = data.Substring(3, 5);
ss = int.Parse(rr.ToString());
}
else if (rr.Substring(4, 1) == ".")
{
rr = data.Substring(3, 4);
ss = int.Parse(rr.ToString());
}
else if (rr.Substring(3, 1) == ".")
{
rr = data.Substring(3, 3);
ss = int.Parse(rr.ToString());
}
else if (rr.Substring(2, 1) == ".")
{
rr = data.Substring(3, 2);
ss = int.Parse(rr.ToString());
}
else if (rr.Substring(1, 1) == ".")
{
rr = data.Substring(3, 1);
ss = int.Parse(rr.ToString());
}
else
{
ss = int.Parse(rr.ToString());
}
#endregion
Log(LogMsgType.Incoming, ss.ToString());//传到rtfTerminal文本里
Log(LogMsgType.Outgoing, "接收内容: " + txtSendData.Text + "\n");//显示用户发送的数据并在后面加"\n"
}
}
catch (Exception ex)
{
MessageBox.Show("接收的数字中,有字符串;出现错误:" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
private void Log(LogMsgType msgtype, string msg)//显示在RtfTerminal文本
{
rtfTerminal.Invoke(new EventHandler(delegate
{
rtfTerminal.SelectedText = string.Empty;//只读
rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold);//字体
rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];//颜色
rtfTerminal.AppendText(msg);//追加
rtfTerminal.ScrollToCaret();
}));
}
private void btnFaSong_Click(object sender, EventArgs e)//发送按钮内容
{
try
{
if (this.txtSendData.Text == "" || this.txtSendData.Text == null)
{
this.txtSendData.Focus();
return;
}
SetFaSong();
}
catch (Exception ex)
{
MessageBox.Show("串口发送时,出现错误:" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnOpenPort_Click(object sender, EventArgs e)//开启串口 /关闭串口
{
try
{
if (this.btnOpenPort.Text == "Open Port")
{//串口打开
comport.PortName = cmbPortName.Text;//端口号
comport.BaudRate = int.Parse(cmbBaudRate.Text);//波特率
comport.DataBits = int.Parse(cmbDataBits.Text); //数据位
#region 奇偶验检位
switch (this.cmbParity.SelectedIndex)
{
case 0://无
comport.Parity = System.IO.Ports.Parity.None;
break;
case 1://偶效验
comport.Parity = System.IO.Ports.Parity.Even;
break;
case 2://奇效验
comport.Parity = System.IO.Ports.Parity.Odd;
break;
}
#endregion
#region 停止位
switch (this.cmbStopBits.SelectedIndex)
{
case 0://1
comport.StopBits = System.IO.Ports.StopBits.One;
break;
case 1://1.5
comport.StopBits = System.IO.Ports.StopBits.OnePointFive;
break;
case 2://2
comport.StopBits = System.IO.Ports.StopBits.Two;
break;
}
#endregion
#region 仪表型号
switch (this.cmbYiBiao.SelectedIndex)
{
case 0://仪表1
comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived1);
break;
case 1://仪表2
//comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived2);
break;
case 2://仪表3
//comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived3);
break;
case 3://仪表4
//comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived4);
break;
}
#endregion
comport.Open();
if (comport.IsOpen)//串口开启
{
this.btnOpenPort.Text = "Close Port";
this.rtfTerminal.Enabled = true;
this.groupBox2.Enabled = true;
groupBox1.Enabled = false;
txtSendData.Focus();
}
}
else
{//串口关闭
comport.Close();//关闭串口
groupBox1.Enabled = true;
this.rtfTerminal.Enabled = false;
this.groupBox2.Enabled = false;
this.btnOpenPort.Text = "Open Port";
this.cmbPortName.Focus();
}
}
catch (Exception ex)
{
MessageBox.Show("串口参数设置错误,出现错误:\n" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void frmSerialPort_Load(object sender, EventArgs e)//窗体加载事件
{
try
{
this.cmbPortName.SelectedIndex = 0;//串口名称
this.cmbBaudRate.SelectedIndex = 5;//波特率
this.cmbDataBits.SelectedIndex = 1;//数据位
this.cmbParity.SelectedIndex = 0;//奇偶验检位
this.cmbStopBits.SelectedIndex = 0;//停止位
this.cmbYiBiao.SelectedIndex = 0;//仪表型号
this.ActiveControl = this.cmbPortName;
}
catch (Exception ex)
{
MessageBox.Show("窗体加载失败,出现错误:\n" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void txtSendData_KeyDown(object sender, KeyEventArgs e)//txtSendData的KeyDown事件
{
try
{
if (e.KeyCode == Keys.Enter)
{
if (this.txtSendData.Text == "" || this.txtSendData.Text == null)
{
this.txtSendData.Focus();
return;
}
SetFaSong();
}
}
catch (Exception ex)
{
MessageBox.Show("串口发送时,出现错误:" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void linkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)//版权
{
//(new frmCopyright()).ShowDialog(this);// 显示版权
}
private void SetFaSong()//发送数据
{
comport.Write(this.txtSendData.Text);//向端口发送数据
Log(LogMsgType.Outgoing, "发送内容: " + txtSendData.Text + "\n");//显示用户发送的数据and在后面加"\n"
this.txtSendData.Text = "";
this.txtSendData.Focus();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -