using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
namespace WindowsFormsApplication3
{
publicpartial class Form1 : Form
{
publicForm1()
{
InitializeComponent();
this.Init(); //打开系统执行初始化程序
}
///<summary>
/// 界面初始化
///</summary>
publicvoid Init()
{
btnSend.Enabled = false;//失能发送按钮
cbCn.Items.AddRange(SerialPort.GetPortNames()); //获取串口号
if(cbCn.Items.Count > 0) cbCn.SelectedIndex = 0; //设置默认串口号
cbCb.SelectedIndex = 5;//设置默认波特率115200
OC.ForeColor = Color.Red; //串口状态默认关闭颜色红色
}
///<summary>
/// 打开/关闭串口
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
privatevoid btnOpen_Click(object sender, EventArgs e)
{
if(cbCn.Items.Count <= 0)
{
OC.Text = "没发现串口";
return;
}
if(!serialPort1.IsOpen)//如果串口没有打开
{
//设置串口参数
serialPort1.PortName = cbCn.SelectedItem.ToString();//设置端口号
serialPort1.BaudRate = Convert.ToInt32(cbCb.SelectedItem.ToString());//设置波特率
try
{
serialPort1.Open();//打开串口
btnSend.Enabled = true;//使能发送按钮
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "错误");
}
btnOpen.Text = "关闭串口";
OC.Text = "串口已打开";
OC.ForeColor = Color.Green;
lblms.Text = "Name:" + serialPort1.PortName + " Baud:" + serialPort1.BaudRate;
}
else//如果串口已打开
{
try
{
serialPort1.Close();//关闭串口
btnSend.Enabled = false;//失能发送按键
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "错误");
}
btnOpen.Text = "打开串口";
OC.Text = "串口已关闭";
OC.ForeColor = Color.Red;
lblms.Text = null;
}
//串口一旦打开不可再配置
cbCb.Enabled = !serialPort1.IsOpen;
cbCn.Enabled = !serialPort1.IsOpen;
}
///<summary>
/// 清空接收区
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
privatevoid btnClRev_Click(object sender, EventArgs e)
{
txtShow.Clear();
txtData1.Clear();
txtData2.Clear();
txtData3.Clear();
txtData4.Clear();
txtData5.Clear();
txtData6.Clear();
}
///<summary>
/// 清空发送区
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
privatevoid btnClSend_Click(object sender, EventArgs e)
{
txtSend.Clear();
}
/*******************数据发送部分**********************/
///<summary>
///发送数据
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
shortSdat1,Sdat2;
privatevoid btnSend_Click(object sender, EventArgs e)
{
byte[] sendData = null;// 定义一个字节数组
byte[] buffer1 = new byte[6];
try
{
Sdat1 =(short)Convert.ToInt16(txtSdat1.Text);//读数据
Sdat2 = (short)Convert.ToInt16(txtSdat2.Text);//读数据
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误");
}
//数据打包
buffer1[0] = 0xFA;
buffer1[1] = 0xFA;
buffer1[2] = (byte)((Sdat1 >> 8) & 0xFF);
buffer1[3] = (byte)(Sdat1 & 0xFF);
buffer1[4] = (byte)((Sdat2 >> 8) & 0xFF);
buffer1[5] = (byte)(Sdat2 & 0xFF);
txtSend.Text = buffer1.Length.ToString();
sendData = Encoding.ASCII.GetBytes(txtSend.Text.Trim());//ASCII发送//trim()数据两端不能是空格
if(serialPort1.IsOpen)//如果串口打开
{
try
{
/*******************串口调用接口******************/
//serialPort1.Write(sendData, 0, sendData.Length);//发送数据
serialPort1.Write(buffer1, 0, buffer1.Length);//发送数据
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "错误");
}
}
else
{
MessageBox.Show("串口未打开", "错误");
}
}
///<summary>
///Hex-->byte
///</summary>
///<param name="s"></param>
///<returns></returns>
privatebyte[] HexStrTobyte(string s)
{
s =s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for(int i = 0; i < s.Length; i += 2)
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}
/*******************数据接收部分**********************/
///<summary>
/// 数据接收
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
privateList<byte> buffer = new List<byte>(4096);
shortDat1, Dat2, Dat3,Dat4,Dat5,Dat6;
privatevoid Form1_Load(object sender, EventArgs e)
{
}
privatevoid DataRec(object sender, SerialDataReceivedEventArgs e)
{
intn = serialPort1.BytesToRead; //读数据位
byte[] RecData = new byte[n];//新建字符串数组从串口读入字节
/***************串口调用接口************************/
serialPort1.Read(RecData, 0, n);//读取数据
buffer.AddRange(RecData);
//数据解包
while(buffer.Count >= 14 &&buffer[0] == 0xAA && buffer[1] == 0xAA)
{
Dat1 = (short)((buffer[2] << 8) | (buffer[3]));
Dat2 = (short)((buffer[4] << 8) | (buffer[5]));
Dat3 = (short)((buffer[6] << 8) | (buffer[7]));
Dat4 = (short)((buffer[8] << 8) | (buffer[9]));
Dat5 = (short)((buffer[10] << 8) | (buffer[11]));
Dat6 = (short)((buffer[12] << 8) | (buffer[13]));
buffer.RemoveRange(0, 14);
}
this.Invoke((EventHandler)(delegate//invoke一个匿名委托跨线程访问ui
{
txtData1.Text = Dat1.ToString();
txtData2.Text = Dat2.ToString();
txtData3.Text = Dat3.ToString();
txtData4.Text = Dat4.ToString();
txtData5.Text = Dat5.ToString();
txtData6.Text = Dat6.ToString();
txtShow.AppendText(byteToHexStr(RecData).ToString().ToUpper());//接收到的数据以hex格式显示
//txtShow.AppendText(Encoding.ASCII.GetString(RecData));//接收数据以ASCII格式显示
}));
}
///<summary>
///byte-->Hex
///</summary>
///<param name="bytes"></param>
///<returns></returns>
publicstatic string byteToHexStr(byte[] bytes)
{
string returnStr = "";
if(bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr +=bytes[i].ToString("X2");//X2 十六进制2位
}
}
return returnStr;
}
}
}