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;
using System.Threading;
using System.IO;
using Microsoft.Office.Core;
namespace SerialPortTest
{
public struct tagData
{
public byte addr;
public byte volt;
public uint tagID;
public DateTime time;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public byte Addr
{
get
{
try
{
return byte.Parse(textBoxReadID.Text);
}
catch
{
return 0;
}
}
}
byte[] mysendBuf = new byte[50];
byte[] myrevBuf = new byte[6000];
SerialPort myport = new SerialPort();
private void Form1_Load(object sender, EventArgs e)
{
comboBoxSerial.SelectedIndex = 0;
comboBoxBaudrate.SelectedIndex = 4;
}
#region 串口类
private void btnOpenPort_Click(object sender, EventArgs e)
{
OpenPort();
}
#region 打开串口
public void OpenPort()
{
if (myport.IsOpen)
{
myport.Close();//打开时点击,则关闭串口
}
else
{
myport.PortName = comboBoxSerial.Text;//关闭时点击,则设置好端口,波特率后打开
myport.BaudRate = int.Parse(comboBoxBaudrate.Text);
try
{
myport.Open();
}
catch (Exception ex)
{
//捕获到异常信息,创建一个新的comm对象,之前的不能用了。
myport = new SerialPort();
//现实异常信息给客户。
MessageBox.Show(ex.Message);
}
}
//设置按钮的状态
btnOpenPort.Text = myport.IsOpen ? "关闭" : "打开";
}
private void comboBoxBaudrate_SelectionChangeCommitted(object sender, EventArgs e)
{
myport.Close();
btnOpenPort.Text = "打开";
}
#endregion
private void btninfo_Click_1(object sender, EventArgs e)
{
if (!myport.IsOpen)
{
MessageBox.Show("请先打开串口!");
}
else
{
readid();
readDB();
textBoxBaudrate.Text = comboBoxBaudrate.Text;
}
}
#region 参数读取方法
private void readDB()
{
byte addr = Addr;
mysendBuf[0] = addr;
mysendBuf[1] = 0x04;
mysendBuf[2] = 0x4c;
mysendBuf[3] = 0x03;
try
{
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 4);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
for (int i = 0; i < 10; i++)
{
if (myport.BytesToRead >= 6)
{
myport.Read(myrevBuf, 0, 6);
if (myrevBuf[0] == 0xFF && myrevBuf[1] == 0xFF && myrevBuf[2] == addr && myrevBuf[4] == 0xEE && myrevBuf[5] == 0xEE)
{
textBoxReaderDB.Text = myrevBuf[3].ToString();
}
break;
}
System.Threading.Thread.Sleep(50);
}
}
private void readid()
{
mysendBuf[0] = 0xFF;
mysendBuf[1] = 0xFF;
mysendBuf[2] = 0x08;
mysendBuf[3] = 0xEE;
mysendBuf[4] = 0xEE;
try
{
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 5);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
for (int i = 0; i < 10; i++)
{
if (myport.BytesToRead >= 5)
{
myport.Read(myrevBuf, 0, 5);
if (myrevBuf[0] == 0xFF && myrevBuf[1] == 0xFF && myrevBuf[3] == 0xEE && myrevBuf[4] == 0xEE)
textBoxReadID.Text = myrevBuf[2].ToString();
break;
}
System.Threading.Thread.Sleep(50);
}
}
#endregion
private void btnSetReadID_Click(object sender, EventArgs e)
{
if (!myport.IsOpen)
{
MessageBox.Show("请先打开串口!");
}
else
{
byte addr = Addr;
byte newaddr = 1;
try
{
newaddr = byte.Parse(textBoxSetReadID.Text.Trim());
if (newaddr <= 0 || newaddr > 127)
{
MessageBox.Show("读卡器地址超出字节范围( 0 < 读卡器地址 < 128 )", "警告提示");
textBoxSetReadID.Text = "";
return;
}
}
catch
{
MessageBox.Show("您要设置的读卡器地址格式错误!", "提示");
}
mysendBuf[0] = addr;
mysendBuf[1] = 0x05;
mysendBuf[2] = 0xc8;
mysendBuf[3] = newaddr;
mysendBuf[4] = 0x03;
try
{
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 5);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
for (int i = 0; i < 10; i++)
{
if (myport.BytesToRead >= 5)
{
myport.Read(myrevBuf, 0, 5);
if (myrevBuf[0] == 0xFF && myrevBuf[1] == 0xFF && myrevBuf[3] == 0xEE && myrevBuf[4] == 0xEE)
{
myrevBuf[0] = myrevBuf[3];
textBoxReadID.Text = myrevBuf[0].ToString();
}
break;
}
System.Threading.Thread.Sleep(50);
}
readid();
textBoxRaw.Text = "";
textBoxRaw.Text += string.Format("地址 设为:{0}\r\n", myrevBuf[2]);
textBoxSetReadID.Text = "";
dataSetTest.DataTable.Clear();
}
}
private void btnSetReadDB_Click(object sender, EventArgs e)
{
if (!myport.IsOpen)
{
MessageBox.Show("请先打开串口!");
}
else
{
byte addr = Addr;
byte stdb = 0;
try
{
stdb = byte.Parse(textBoxSetReadDB.Text.Trim());
if (stdb < 0 || stdb > 31)
{
MessageBox.Show("衰减值超出限定范围( 0 = 衰减值 < 32 )", "警告提示");
textBoxSetReadDB.Text = "";
return;
}
}
catch
{
MessageBox.Show("您要设置的衰减值格式错误!", "提示");
}
mysendBuf[0] = addr;
mysendBuf[1] = 0x05;
mysendBuf[2] = 0xcc;
mysendBuf[3] = stdb;
mysendBuf[4] = 0x03;
try
{
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 5);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
for (int i = 0; i < 10; i++)
{
if (myport.BytesToRead >= 6)
{
myport.Read(myrevBuf, 0, 6);
if (myrevBuf[0] == 0xFF && myrevBuf[1] == 0xFF && myrevBuf[4] == 0xEE && myrevBuf[5] == 0xEE)
{
textBoxSetReadDB.Text = myrevBuf[3].ToString();
}
break;
}
System.Threading.Thread.Sleep(50);
}
readDB();
textBoxRaw.Text = string.Format("衰减值 设为:{0}\r\n", myrevBuf[3]);
textBoxSetReadDB.Text = "";
dataSetTest.DataTable.Clear();
}
}
private void btnSetBaudrate_Click(object sender, EventArgs e)
{
if (!myport.IsOpen)
{
MessageBox.Show("请先打开串口!");
}
else
{
if (comboBoxBuzzer.Text == "" || comboBoxBuzzer.Text == "开")
{
MessageBox.Show("先关闭蜂鸣器", "操作提示");
}
else
{
MessageBox.Show("你确定要更改 波特率 吗?", "警告提示");
byte addr = Addr;
byte baud = (byte)(comboBoxSetBaudrate.SelectedIndex);
mysendBuf[0] = addr;
mysendBuf[1] = 0x05;
mysendBuf[2] = 0xc9;
mysendBuf[3] = baud;
mysendBuf[4] = 0x03;
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 5);
for (int i = 0; i < 10; i++)
{
if (myport.BytesToRead >= 6)
{
myport.Read(mysendBuf, 0, 6);
if (myrevBuf[0] == 0xFF && myrevBuf[1] == 0xFF && myrevBuf[3] == baud && myrevBuf[4] == 0xEE && myrevBuf[5] == 0xEE) { }
}
}
textBoxBaudrate.Text = comboBoxBaudrate.Text = comboBoxSetBaudrate.Text;
OpenPort();
OpenPort();
textBoxRaw.Text = "\r波特率 设为:" + comboBoxBaudrate.Text;
dataSetTest.DataTable.Clear();
}
}
}
private void btnBuzzerNF_Click(object sender, EventArgs e)
{
if (!myport.IsOpen)
{
MessageBox.Show("请先打开串口!");
}
else
{
Buzzer();
}
textBoxRaw.Text = "\r蜂鸣器 状态:" + comboBoxBuzzer.Text;
}
private void Buzzer()
{
byte addr = Addr;
mysendBuf[0] = addr;
mysendBuf[1] = 0x05;
mysendBuf[2] = 0xcd;
mysendBuf[3] = (byte)(comboBoxBuzzer.SelectedIndex);
mysendBuf[4] = 0x03;
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 5);
for (int i = 0; i < 10; i++)
{
if (myport.BytesToRead >= 6)
{
myport.Read(mysendBuf, 0, 6);
if (myrevBuf[0] == 0xFF && myrevBuf[1] == 0xFF && myrevBuf[4] == 0xEE && myrevBuf[5] == 0xEE) { }
}
}
}
#endregion
private void btnRead_Click(object sender, EventArgs e)
{
if (!myport.IsOpen)
{
MessageBox.Show("请先打开串口!");
}
else
{
dataSetTest.DataTable.Clear();
textBoxRaw.Text = "";
byte addr = Addr;
mysendBuf[0] = addr;
mysendBuf[1] = 4;
mysendBuf[2] = 1;
mysendBuf[3] = 3;
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 4);
readOld(addr);
}
}
#region 读取
private void readOld(byte addr)
{
int revLength = 0;
for (int i = 0; i < 100; i++)
{
int btr = myport.BytesToRead;
if (btr > 0)
{
int num = myport.Read(myrevBuf, revLength, btr);
/*=====================================================================*/
string strData = "";//
for (int j = revLength; j < revLength + num; j++)//
{
strData += string.Format("{0:X2} ", myrevBuf[j]);//
}
revLength += num;//
textBoxRaw.Text += strData;//
/*=====================================================================*/
if (revLength >= 6 && myrevBuf[0] == 0xFF && myrevBuf[1] == 0xFF && myrevBuf[revLength - 2] == 0xEE && myrevBuf[revLength - 1] == 0xEE)
{
#region 2字节
if (rbtn2.Checked)
{
if ((revLength - 6) % 2 == 0)
{
for (int j = 4; j < revLength - 2; j += 2)
{
string adr = addr.ToString();
string volt = (myrevBuf[j] & 0x80) == 0 ? "正常" : "欠压";
string tagID = Convert.ToString(((myrevBuf[j] & 0x7F) << 8) | myrevBuf[j + 1]);
string b2 = (revLength - 6) % 2 == 0 ? "2" : "非2字节";
DateTime nowTime = DateTime.Now;
dataSetTest.DataTable.AddDataTableRow(adr, tagID, b2.ToString(), volt, nowTime.ToString());
}
}
else
{
MessageBox.Show("2字节读取数据出现错误", "信息提示");
}
}
#endregion
#region 5字节
else if (rbtn5.Checked)
{
if ((revLength - 6) % 5 == 0)
{
for (int j = 4; j < revLength - 5; j += 5)
{
string adr = addr.ToString();
string volt = (myrevBuf[j] & 0x80) == 0 ? "正常" : "欠压";
UInt32 tagID = myrevBuf[j + 1];
tagID <<= 8;
tagID |= myrevBuf[j + 2];
tagID <<= 8;
tagID |= myrevBuf[j + 3];
tagID <<= 8;
tagID |= myrevBuf[j + 4];
string strtagID = Convert.ToString(tagID);
string b5 = (revLength - 6) % 5 == 0 ? "5" : "非5字节";
DateTime nowTime = DateTime.Now;
dataSetTest.DataTable.AddDataTableRow(adr, strtagID, b5.ToString(), volt, nowTime.ToString());
}
}
else
{
MessageBox.Show("5字节读取数据出现错误", "信息提示");
}
}
#endregion
#region 内容
else
{
MessageBox.Show("请先选择读取数据的字节格式!", "信息提示");
}
label13.Text = dataSetTest.DataTable.Count.ToString();
break;
#endregion
}
}
System.Threading.Thread.Sleep(50);
}
}
#endregion
private void 导出数据ToolStripMenuItem_Click(object sender, EventArgs e)
{
ExportToExcel();
}
#region 导出数据
private void ExportToExcel()
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl Files (*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.Title = "保存为Excel文件";
saveFileDialog.ShowDialog();
if (saveFileDialog.FileName.IndexOf(":") < 0) return; //被点了"取消"
Stream myStream;
myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
string columnTitle = "";
try
{
//写入列标题
for (int i = 0; i < dataGridViewX1.ColumnCount; i++)
{
if (i > 0)
{
columnTitle += "\t";
}
columnTitle += dataGridViewX1.Columns[i].HeaderText;
}
sw.WriteLine(columnTitle);
//写入列内容
for (int j = 0; j < dataGridViewX1.Rows.Count; j++)
{
string columnValue = "";
for (int k = 0; k < dataGridViewX1.Columns.Count; k++)
{
if (k > 0)
{
columnValue += "\t";
}
if (dataGridViewX1.Rows[j].Cells[k].Value == null)
columnValue += "";
else
columnValue += dataGridViewX1.Rows[j].Cells[k].Value.ToString().Trim();
}
sw.WriteLine(columnValue);
}
sw.Close();
myStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
sw.Close();
myStream.Close();
}
}
#endregion
private void btnClear_Click(object sender, EventArgs e)
{
if (!myport.IsOpen)
{
MessageBox.Show("请先打开串口!");
}
else
{
byte addr = Addr;
if (addr == 0)
{
MessageBox.Show("您输入的读卡器地址格式错误", "提示信息");
return;
}
mysendBuf[0] = addr;
mysendBuf[1] = 0x04;
mysendBuf[2] = 0x02;
mysendBuf[3] = 0x03;
myport.DiscardInBuffer();
myport.DiscardOutBuffer();
myport.Write(mysendBuf, 0, 4);
dataSetTest.DataTable.Clear();
textBoxRaw.Text = "";
}
}
private void 清空ToolStripMenuItem_Click(object sender, EventArgs e)
{
dataSetTest.DataTable.Clear();
}
private void 清空ToolStripMenuItem1_Click(object sender, EventArgs e)
{
textBoxRaw.Text = "";
}
}
}
串
最新推荐文章于 2025-04-16 17:27:48 发布