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 SerialCommunicate
{
public partial class Form1 : Form
{
public string Receive_buff { get; private set; }
public int cnt { get; private set; }
public Form1()
{
InitializeComponent();
}
private DateTime current_time = new DateTime(); //为了避免在接收处理函数中反复调用,依然声明为一个全局变量
private StringBuilder sb = new StringBuilder();//为了避免在接收处理函数中反复调用,依然声明为一个全局变量
private void Form1_Load(object sender, EventArgs e)
{
//设置默认值
comboBox1.Text = "115200"; //波特率
comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
serialPort1.BaudRate = 115200;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Handshake = Handshake.None;
serialPort1.Close();
}
private void button1_Click(object sender, EventArgs e) //打开关闭串口按钮
{
try
{ //将可能产生异常的代码放置在try块中
//根据当前串口属性来判断是否打开
serialPort1.Encoding = System.Text.Encoding.GetEncoding("gb2312");
if (serialPort1.IsOpen)
{
//串口已经处于打开状态
serialPort1.Close(); //关闭串口
button1.Text = "打开串口";
button1.BackColor = Color.ForestGreen;
comboBox1.Enabled = true; //打开串口按钮可用
comboBox2.Enabled = false; //关闭串口按钮不可用
}
else
{
//串口已经处于关闭状态,则设置好串口属性后打开
comboBox1.Enabled = true;
comboBox2.Enabled = true;
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
serialPort1.Open();//打开串口
button1.Text = "关闭串口";
button1.BackColor = Color.Firebrick;
}
}
catch
{
MessageBox.Show("端口打开失败", "错误");
}
}
private void button2_Click(object sender, EventArgs e) //清空接收区
{
textBox1.Text = "";
}
private void button3_Click(object sender, EventArgs e) //检测发送按钮
{
int num = textBox2.Text.Length;
string text = textBox2.Text;
try
{
//首先判断串口是否开启
if (serialPort1.IsOpen)
{
//串口处于开启状态,将发送区文本发送
byte[] data = new byte[] { 0xaa, 0x55, 0x01, 0x00, 0xFB, 0xB1, 0x2F, 0x00, 0x10, 0x32, 0x03, 0x1D };
serialPort1.Write(data, 0, data.Length);
// SetAutoSizeMode();
}
}
catch
{
MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
serialPort1.Close();
}
button6.Text = "检测中...";
button6.BackColor = Color.Transparent;
button7.Text = " "; //窗口数据
}
private void button5_Click_1(object sender, EventArgs e) //完成发送按钮
{
int num = textBox3.Text.Length;
try
{
//首先判断串口是否开启
if (serialPort1.IsOpen)
{
//串口处于开启状态,将发送区文本发送
byte[] data = new byte[] { 0xaa, 0x55, 0x01, 0x00, 0xFB, 0xb1, 0x00, 0x10, 0x32, 0x02, 0xEE };//aa 55 01 00 FB b1 00 10 32 02 EE
serialPort1.Write(data, 0, data.Length);
}
}
catch
{
MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
serialPort1.Close();
}
if (serialPort1.IsOpen)
{
button6.Text = "通过";
button7.Text = "2000/3000";
button7.BackColor = Color.Transparent;
}
else
{
button6.Text = "不通过";
button7.Text = "0/3000";
}
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)//数据接收事件的方法
{
int sum = serialPort1.BytesToRead; //获取接收缓冲区中的字节数;
byte[] received_buf = new byte[sum];//声明一个大小为num的字节数据用于存放读出的byte型数据
sb.Clear(); //防止出错,首先清空字符串构造器
str = serialPort1.ReadExisting(); // 读取串口数据
//显示时间
try
{
this.Invoke((EventHandler)(delegate
{
Receive_buff = serialPort1.ReadExisting(); //将串口1读取到的数据放在Receive_buff中
buffer.Append(Receive_buff); //将分段的数据存放在一个字符串中,方便解析数据
if (Receive_buff.Length > 0 && Receive_buff.IndexOf("****") != -1)//if (checkBox1.Checked)
{
current_time = System.DateTime.Now; //获取当前时间
textBox1.AppendText(current_time.ToString("HH:mm:ss") + " " + str); //sb.ToString()
textBox1.Text = (buffer.ToString());
string[] strs = buffer.ToString().Split("\r\n".ToCharArray());
for (int i = 0; i < strs.Length; i++)
{
buffer1.Clear();
}
buffer.Clear();
}
else
{
textBox1.AppendText(str);
int DateTime_count = 0;
DateTime_count += sum; //接收字节计数变量增加sum
}
}));
}
catch
{
MessageBox.Show("端口接收失败,系统将关闭当前串口", "错误");
serialPort1.Close();
}
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
serialPort1.Close();
button1.ForeColor = Color.Black;
button1.Text = "打开串口";
comboBox1.Items.Clear();
comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
}
}
StringBuilder buffer = new StringBuilder();
StringBuilder buffer1 = new StringBuilder();
private string str;
private string StringToHexString(string s, Encoding encode) // 字符串转换为16进制字符
{
byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
string result = string.Empty;
for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符
{
result += Convert.ToString(b[i], 16);
}
return result;
}
private void output(string info)
{
textBox2.Text = "";
textBox2.AppendText(DateTime.Now.ToString("HH:mm:ss") + info + "\r\n");
}
private void button6_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
}
else
{
// button7.Text = button6.ToString / 2000;
button7.Text = "通过";
}
}
private void button7_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// e.KeyChar == 8 退格 删除
if ((e.KeyChar >= 'a' && e.KeyChar <= 'z') || (e.KeyChar >= 'A' && e.KeyChar <= 'Z')
|| (e.KeyChar >= '0' && e.KeyChar <= '9') || (e.KeyChar == 8))
{
e.Handled = false;//这可以输入
}
else
{
e.Handled = true;//不能输入
}
}
}
}