来源:互联网 发布:知乐作品 编辑:程序博客网 时间:2024/04/30 08:14
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 = "";        }    }}

原创粉丝点击