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.Ports;
using System.Text.RegularExpressions;
namespace 串口
{
public partial class Form1 : Form
{
SerialPort sp1 = new SerialPort();
public Form1()
{
InitializeComponent();
}
private void zedGraphControl1_Load(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived);
string[] str = SerialPort.GetPortNames(); //检查是否有串口
if (str == null)
{
MessageBox.Show("本机没有串口!", "Error");
return;
}
foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
{
cbSerial.Items.Add(s); //添加串口
}
cbSerial.SelectedIndex = 0; //各默认选择项
cbBaudRate.SelectedIndex = 3;
cbDataBits.SelectedIndex = 3;
cbStop.SelectedIndex = 0;
cbParity.SelectedIndex = 0;
rdbSend.Checked = true; //发送接收默认选择16进制
rdbRcv.Checked = true;
}
private void button1_Click(object sender, EventArgs e)
{
if (!sp1.IsOpen) //如果没有打开
{
try
{
string serialName = cbSerial.SelectedItem.ToString();
sp1.PortName = serialName; //设置各串口号
string strBaudRate = cbBaudRate.Text; //串口设置
string strDateBits = cbDataBits.Text;
string strStopBits = cbStop.Text;
Int32 iBaudRate = Convert.ToInt32(strBaudRate);
Int32 iDateBits = Convert.ToInt32(strDateBits);
sp1.BaudRate = iBaudRate; //波特率
sp1.DataBits = iDateBits; //数据位
switch (cbStop.Text) //停止位
{
case "1":
sp1.StopBits = StopBits.One;
break;
case "1.5":
sp1.StopBits = StopBits.OnePointFive;
break;
case "2":
sp1.StopBits = StopBits.Two;
break;
default:
MessageBox.Show("Error:参数不正确!", "Error");
break;
}
switch (cbParity.Text) //校验位
{
case "无":
sp1.Parity = Parity.None;
break;
case "奇校验":
sp1.Parity = Parity.Odd;
break;
case "偶校验":
sp1.Parity = Parity.Even;
break;
default:
MessageBox.Show("Error:参数不正确!", "Error");
break;
}
if (sp1.IsOpen == true)
{
sp1.Close();
}
//状态栏设置
tsSpNum.Text = "串口号:" + sp1.PortName + "|";
tsBaudRate.Text = "波特率:" + sp1.BaudRate + "|";
tsDataBits.Text = "数据位:" + sp1.DataBits + "|";
tsStopBits.Text = "停止位:" + sp1.StopBits + "|";
tsParity.Text = "校验位:" + sp1.Parity + "|";
//设置必要控件不可用
cbSerial.Enabled = false;
cbBaudRate.Enabled = false;
cbDataBits.Enabled = false;
cbStop.Enabled = false;
cbParity.Enabled = false;
sp1.Open();
button1.Text = "关闭串口";
}
catch (System.Exception ex)
{
MessageBox.Show("Error:" + ex.Message, "Error");
return;
}
}
else
{
//状态栏设置(串口关闭的情况下)
tsSpNum.Text = "串口号:未指定|";
tsBaudRate.Text = "波特率:未指定|";
tsDataBits.Text = "数据位:未指定|";
tsStopBits.Text = "停止位:未指定|";
tsParity.Text = "校验位:未指定|";
//恢复控件功能
cbSerial.Enabled = true;
cbBaudRate.Enabled = true;
cbDataBits.Enabled = true;
cbStop.Enabled = true;
cbParity.Enabled = true;
sp1.Close();
button1.Text = "打开串口";
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (!sp1.IsOpen) //如果没有打开
{
MessageBox.Show("清先打开串口!", "Error");
return;
}
string strSend = txtSend.Text;
if (rdbSend.Checked == true)
{
string sendBuf = strSend; //发送缓冲
string sendnoNull = sendBuf.Trim(); //去除前后空白字符
string sendnoCommaE=sendnoNull.Replace(',',' '); //去掉英文逗号
string sendnoCommaC=sendnoCommaE.Replace(',',' ');//去掉中文逗号
string sendnoStr1=sendnoCommaC.Replace("0x","");
string sendnoStr2=sendnoStr1.Replace ("0X","");
string[] strArray = sendnoStr2.Split(' ');
int byteBufferLength = strArray.Length;
for (int i = 0; i<strArray.Length;i++ ) ////去掉数组中的空字符元素
{
if (strArray[i] == "")
{
byteBufferLength--;
}
}
byte[] byteBuffer=new byte[byteBufferLength]; //定义除去空字符后的新发送缓冲数组
int ii=0;
for(int i=0;i<strArray.Length;i++)
{
Byte[] bytesOfStr=Encoding.Default.GetBytes(strArray[i]);/////////???将每个字符元素编码为一个字节
int decNum=0;
if(strArray[i]=="")
{
continue ;
}
else
{
decNum=Convert.ToInt32(strArray[i],16); //将空字符以外的字符元素转换成32位有符号整形
}
try //保证发送文本框中只能输入一个字节的字符即eb 90等
{
byteBuffer[ii]=Convert.ToByte(decNum);
}
catch (System .Exception ex)
{
MessageBox.Show ("字节越界,请逐个字节输入!","Error");
return;
}
ii++;
}
sp1.Write(byteBuffer,0,byteBuffer.Length);
}
else //以字符串形式发送
{
sp1.WriteLine(txtSend.Text);
}
}
void sp1_DataReceived(object sender, SerialDataRe