主窗体及下的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class 串口助手 : Form
{
public 串口助手()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性 为false
}
protected Boolean stop = false;
protected Boolean conState = false;
private int num = 0;
private StringBuilder builder = new StringBuilder();
private UInt32 tx, rx = 0,aa=0;
SerialPort sp = new SerialPort();//实例化串口通讯类
//以下定义4个公有变量,用于参数传递
public static string strProtName = "";
public static string strBaudRate = "";
public static string strDataBits = "";
public static string strStopBits = "";
private void Form1_Load(object sender, EventArgs e)
{
// 端口未打开时
groupBox1.Enabled = false;//发送区不可选
groupBox2.Enabled = false;//接收区不可选
groupBox3.Enabled = true;//默认定时发送不选中,功能区可用
this.toolStripStatusLabel1.Text = "端口号:端口未打开 | ";
this.toolStripStatusLabel2.Text = "波特率:端口未打开 | ";
this.toolStripStatusLabel3.Text = "数据位:端口未打开 | ";
this.toolStripStatusLabel4.Text = "停止位:端口未打开 | ";
this.toolStripStatusLabel5.Text = "";
}
//串口设置按钮监听事件
private void btnSetSP_Click_1(object sender, EventArgs e)
{
timer1.Enabled = false;//关闭计时器1
sp.Close();//关闭当前串口
Form2 dlg = new Form2();//打开串口设置窗口
if (dlg.ShowDialog() == DialogResult.OK)//判断是否点击了串口设置窗口的确定按钮,在设置窗口的确定按钮监听下设置了DialogResult = DialogResult.OK;
{//将串口设置窗口的参数传到串口的设置参数中
sp.PortName = strProtName;//串口号
sp.BaudRate = int.Parse(strBaudRate);//波特率
sp.DataBits = int.Parse(strDataBits);//数据位
sp.StopBits = (StopBits)int.Parse(strStopBits);//停止位
sp.ReadTimeout = 500;//读取数据的超时时间,引发ReadExisting异常
}
}
private void bntSwitchSP_Click(object sender, EventArgs e)
{
if (bntSwitchSP.Text == "打开串口")
{
if (strProtName != "" && strBaudRate != "" && strDataBits != "" && strStopBits != "")
{
try
{
if (sp.IsOpen)
{
sp.Close();
sp.Open();//打开串口
}
else
{
sp.Open();//打开串口
}
bntSwitchSP.Text = "关闭串口";
groupBox1.Enabled = true;//发送区可选
groupBox2.Enabled = true;//接收区可选
this.toolStripStatusLabel1.Text = "端口号:" + sp.PortName + " | ";
this.toolStripStatusLabel2.Text = "波特率:" + sp.BaudRate + " | ";
this.toolStripStatusLabel3.Text = "数据位:" + sp.DataBits + " | ";
this.toolStripStatusLabel4.Text = "停止位:" + sp.StopBits + " | ";
this.toolStripStatusLabel5.Text = "";
}
catch (Exception ex)
{
MessageBox.Show("错误:" + ex.Message, "C#串口通信");
}
}
else
{
MessageBox.Show("请先设置串口!", "RS232串口通信");
}
sp.Encoding = Encoding.GetEncoding("GB2312");
sp.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
else
{
timer2.Stop();
timer1.Enabled = false;
timer2.Enabled = false;
bntSwitchSP.Text = "打开串口";
if (sp.IsOpen) sp.Close();
groupBox1.Enabled = false;
groupBox2.Enabled = false;
this.toolStripStatusLabel1.Text = "端口号:端口未打开 | ";
this.toolStripStatusLabel2.Text = "波特率:端口未打开 | ";
this.toolStripStatusLabel3.Text = "数据位:端口未打开 | ";
this.toolStripStatusLabel4.Text = "停止位:端口未打开 | ";
// this.toolStripStatusLabel5.Text = "";
this.toolStripStatusLabel6.Text = "接收:0" + " " + "发送:0" + " |";
}
}
//定时发送
private void timer2_Tick(object sender, EventArgs e)
{
if (checkBox1_timer.Checked == false)
{
if (button1.Text == "关闭发送")
{
if (num > 0)
{
num--;
textBox2.Text = Convert.ToString(num);
if (num == 0)
num = 0;
send();
}
}
}
else
{
send();
}
}
开启定时发送
private void checkBox1_timer_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1_timer.Checked)
{
if (sp.IsOpen)
{
try
{
groupBox3.Enabled = false;//定时发送选中,功能区不可用
timer2.Interval = Convert.ToInt32(textBox1.Text);
timer2.Start(); // 启动计时器, 默认不启动
}
catch (Exception ec)
{
MessageBox.Show(ec.Message);
}
}
else
{
MessageBox.Show("请打开串口");
}
} 关闭定时发送
else// if (checkBox1_timer.Checked == false)
{
groupBox3.Enabled = true;//定时发送不选中,功能区可用
timer2.Stop();
}
}
/// <summary>
/// 定时发送固定帧数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "开始发送")
{
num = Convert.ToInt32(textBox2.Text);
if (num > 0)
{
timer2.Interval = Convert.ToInt32(textBox3.Text);
timer2.Start();//开启定时器发送数据
}
else
{
timer2.Stop();//关闭定时器
MessageBox.Show("帧数必须大于0", "提示");
}
button1.Text = "关闭发送";
}
else
{
timer2.Stop();//关闭定时器
button1.Text = "打开发送";
}
}
//清除发送
private void button3_Click(object sender, EventArgs e)
{
txtSend.Clear();
}
//清除接收
private void button4_Click(object sender, EventArgs e)
{
txtReceiveData.Clear();
}
//发送数据按键
private void bntSendData_Click(object sender, EventArgs e)
{
send();
}
private void send()
{
if (sp.IsOpen)
{
if (hex_Send.Checked == true)//数值发送模式
{
if (txtSend.Text != "")//发送输入框有内容
{
if (IsHex(txtSend.Text))//判断是否是16进制
{
try
{
byte[] data = new byte[1];
// MessageBox.Show(textBox2.Text.Length.ToString());
for (int i = 0; i < txtSend.Text.Length / 2; i++)
{
data[0] = Convert.ToByte(txtSend.Text.Substring(i * 2, 2).ToUpper(), 16);
//MessageBox.Show(data[0].ToString());
sp.Write(data, 0, 1);
}
if (txtSend.Text.Length % 2 != 0)
{
data[0] = Convert.ToByte(txtSend.Text.Substring(txtSend.Text.Length - 1, 1).ToUpper(), 16);
sp.Write(data, 0, 1);
}
tx += (UInt32)txtSend.Text.Length;
toolStripStatusLabel6.Text = "接收:" + rx.ToString() + " " + "发送:" + tx.ToString() + " |";
}
catch
{
MessageBox.Show("请输入“0-9”“A-F”“a-f”", "提示");
}
}
else//发送输入框含有非16进制内容 转换成ascii 码发送
{
try
{
byte[] ascii = System.Text.Encoding.ASCII.GetBytes(txtSend.Text);//将当前内容转换成ascii码
sp.Write(ascii, 0, txtSend.Text.Length);
tx += (UInt32)txtSend.Text.Length;
toolStripStatusLabel6.Text = "接收:" + rx.ToString() + " " + "发送:" + tx.ToString() + " |";
}
catch
{
}
}
}
else
{ }/*发送框内无内容 等待用户输入*/
}
else//以字符模式发送
{
if (txtSend.Text != "")
{
try
{
//System.Text.Encoding.Default utf8 = new System.Text.UTF8Encoding();
byte[] texts = System.Text.Encoding.Default.GetBytes(txtSend.Text);
sp.Write(texts, 0, texts.Length);
// ComDevice.WriteLine(textBox2.Text);
tx += (UInt32)txtSend.Text.Length;
toolStripStatusLabel6.Text = "接收:" + rx.ToString() + " " + "发送:" + tx.ToString() + " |";
}
catch
{ }
// ComDevice.WriteLine(texts);
}
else
{ }/*发送框内无内容 等待用户输入*/
}
}
else
{
MessageBox.Show("请先打开串口!");
}
}
/// <summary>
/// 判断字符串是否是 16进制
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private bool IsHex(string str)
{
if (str == "") return false;
const string PATTERN = @"[A-Fa-f0-9]+$";//正则匹配
bool sign = false;
for (int i = 0; i < str.Length; i++)
{
sign = System.Text.RegularExpressions.Regex.IsMatch(str[i].ToString(), PATTERN);
if (!sign)
{
return false;
}
}
return true;
}
//接收事件
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (checkBox1.Checked)
{
int n = sp.BytesToRead;
byte[] buf = new byte[n];
sp.Read(buf, 0, n);
builder.Clear();
rx += (UInt32)n;
foreach (byte i in buf)
{
builder.Append(i.ToString("x2") + " ");
}
txtReceiveData.AppendText(builder.ToString());
toolStripStatusLabel6.Text = "接收:" + rx.ToString() + " " + "发送:" + tx.ToString() + " |";
}
else
{
string str = sp.ReadExisting();
rx += (UInt32)str.Length;//获取接收字节数
// builder.Append(Encoding.Default.GetString(buf));
// this.textBox1.AppendText(builder.ToString());
toolStripStatusLabel6.Text = "接收:" + rx.ToString() + " " + "发送:" + tx.ToString() + " |";
this.txtReceiveData.AppendText(str);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
设置窗口的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
//串口
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
cmbPort.Items.Add(port);
}
cmbPort.SelectedIndex = 0;
//波特率
cmbBaudRate.Items.Add("110");
cmbBaudRate.Items.Add("300");
cmbBaudRate.Items.Add("1200");
cmbBaudRate.Items.Add("2400");
cmbBaudRate.Items.Add("4800");
cmbBaudRate.Items.Add("9600");
cmbBaudRate.Items.Add("19200");
cmbBaudRate.Items.Add("38400");
cmbBaudRate.Items.Add("57600");
cmbBaudRate.Items.Add("115200");
cmbBaudRate.Items.Add("230400");
cmbBaudRate.Items.Add("460800");
cmbBaudRate.Items.Add("921600");
cmbBaudRate.SelectedIndex = 5;
//数据位
cmbDataBits.Items.Add("5");
cmbDataBits.Items.Add("6");
cmbDataBits.Items.Add("7");
cmbDataBits.Items.Add("8");
cmbDataBits.SelectedIndex = 3;
//停止位
cmbStopBit.Items.Add("1");
cmbStopBit.SelectedIndex = 0;
//佼验位
cmbParity.Items.Add("无");
cmbParity.SelectedIndex = 0;
}
private void bntOK_Click_1(object sender, EventArgs e)
{
//以下4个参数都是从窗体MainForm传入的
串口助手.strProtName = cmbPort.Text;
串口助手.strBaudRate = cmbBaudRate.Text;
串口助手.strDataBits = cmbDataBits.Text;
串口助手.strStopBits = cmbStopBit.Text;
DialogResult = DialogResult.OK;
}
private void cmbPort_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void bntCancel_Click_1(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
}
}
主窗体界面
设置窗口界面