通过代理接收,实现串口通信

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using static Userlogin.UserManager; //空间.类




//本窗体的难度在于如何把数据送到主窗体中。
//设置好配置以后,点击“保存”,通过委托的方式,把SerialportConfigure这个集合送到主页面
//也可以把这个SerialportConfigure集合序列到一个文件中,保存后,通知主页
//主页再反序列化获得串口配置


//在FORM4建立委托

namespace ABS测试台
{

    

    public partial class Form4 : Form
    {

      

        public delegate void ShowMessageService(string text);//定义一个委托

        public MyDelegate showMessageChild;


        public string SerialPortRxdata;
        public string SerialPortTxdata;
        public const int WM_DEVICE_CHANGE = 0x219;             //设备改变           
        public const int DBT_DEVICEARRIVAL = 0x8000;          //设备插入
        public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //设备移除

        List<SerialCongfigure> ComConfig = new List<SerialCongfigure>
        {
          new SerialCongfigure(){  },
        };

 

        //获取串口号
        private bool  SearchSerialComm(System.IO.Ports.SerialPort MySerialPort, ListBox   mycombobox)
        {

#if (false)
//这个部分的代码有个问题,不能根本上支持热插拔,拔出以后
//导致出问题,这个代码作为演示,或者可以
            mycombobox.Items.Clear();
            for (int i = 1; i < 20; i++)
            {
                try
                {
                    MySerialPort.PortName = "COM" + i.ToString();
                    MySerialPort.Open();
                    mycombobox.Items.Add(MySerialPort.PortName);
                    MySerialPort.Close();
                }
                catch { }
            }
#else
            mycombobox.SelectedIndex = -1;
            mycombobox.Items.Clear();
            string[] serial_list = SerialPort.GetPortNames();
            if (serial_list.Length > 0)
            {
                Array.Sort(serial_list);
                mycombobox.Items.AddRange(serial_list);
                mycombobox.SelectedIndex = 0;
                return true;
            }
            else { return false; }

#endif

        }


        public Form4()
        {
            InitializeComponent();
            listBox1.SelectedIndex = 0;
            listBox2.SelectedIndex = 0;
            listBox3.SelectedIndex = 0;
            listBox4.SelectedIndex = 0;
            listBox5.SelectedIndex = 0;
            listBox6.SelectedIndex = 0;
     
        }


        private void test_Load(object sender, EventArgs e)
        {

            //this.WindowState = FormWindowState.Maximized;//子窗体最大化
            this.FormBorderStyle = FormBorderStyle.None;//
           

            //Serial
            //this.serialPort2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort2_DataReceived);
            // serialPort2.DataReceived += SerialDataReceivedEventHandler();
            if (SearchSerialComm(serialPort2, listBox1))//获取当前可用的端口号到LISTBOX1,如果没有,提示“当前没有串口可用”
            {
                //启动委托线程
                serialPort2.Encoding = Encoding.GetEncoding("GB2312");
                bAccpet = true;
                getRecevice = new Thread(new ThreadStart(testDelegate));
                //getRecevice.IsBackground = true;
                getRecevice.Start();
            }
            else
            {
                MessageBox.Show("没有可用的串口!");
            }

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {



        }

        //退出
        private void button3_Click(object sender, EventArgs e)
        {
            bAccpet = false;
            try
            {   //停止主监听线程
                if (null != getRecevice)
                {
                    if (getRecevice.IsAlive)
                    {
                        if (!getRecevice.Join(100))
                        {
                            //关闭线程
                            getRecevice.Abort();
                        }
                    }
                    getRecevice = null;
                }
            }
            catch { }
            serialPort2.Close();//关闭
            this.Close();
            this.Dispose();
        }

        //保存
        private void button2_Click(object sender, EventArgs e)
        {

            //把面板上的数据全部获取到SerialPortConfigure
            ComConfig[0].PortName  = listBox1.Text;  //获取当前的可用的串口号
            ComConfig[0].DataRate = listBox2.Text;
            ComConfig[0].ByteCount  = listBox3.Text;
            ComConfig[0].CrcCheck = listBox4.Text;
            ComConfig[0].StopBitCount = listBox5.Text;
            ComConfig[0].StreamControl = listBox6.Text;
 

            //把配置序列化到serial_configure.ins文件中

            if (File.Exists(@"d:\C#\SerialConfigure.ins") == false) File.Delete(@"d:\C#\SerialConfigure.ins");
            using (FileStream fs = new FileStream(@"d:\C#\SerialConfigure.ins", FileMode.Create, FileAccess.Write))
            {
               BinaryFormatter Format = new BinaryFormatter();
               Format.Serialize(fs, ComConfig);//把listuser序列化到pwd.ins文件中

               fs.Close();
            }


            //再反序列化读出到comconfig
            if (File.Exists(@"d:\C#\SerialConfigure.ins") == true )
            {
                try
                {
                    using (FileStream fs = new FileStream(@"d:\C#\SerialConfigure.ins", FileMode.Open, FileAccess.Read))
                    {
                        BinaryFormatter Format = new BinaryFormatter();
                        ComConfig = (List<SerialCongfigure>)Format.Deserialize(fs);
 
                        MessageBox.Show("SerialConfigure反序列化测试完成");//弹出对话框,等待用户确认
                        fs.Close();
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("SerialConfigure文件读取存在异常");
                }
            }

            //输出在发射区
            textBox1.Text += ComConfig[0].PortName;
            textBox1.Text += "\r\n";//换行
            textBox1.Text += ComConfig[0].DataRate;
            textBox1.Text += "\r\n";//换行
            textBox1.Text += ComConfig[0].ByteCount;
            textBox1.Text += "\r\n";//换行
            textBox1.Text += ComConfig[0].CrcCheck;
            textBox1.Text += "\r\n";//换行
            textBox1.Text += ComConfig[0].StopBitCount;
            textBox1.Text += "\r\n";//换行
            textBox1.Text += ComConfig[0].StreamControl;

            //通知主窗体,通信设置完成,有必要吗,没有必要!!!


            //按照配置打开串口
            try
            {
                if (serialPort2.IsOpen == false)
                {
                    serialPort2.BaudRate = 38400;
                    serialPort2.PortName = ComConfig[0].PortName ;
                    serialPort2.Open();
                    MessageBox.Show("串口已经打开");
                }
                else
                {
                    serialPort2.Close ();
                    serialPort2.BaudRate = 38400;
                    serialPort2.PortName = ComConfig[0].PortName ;
                    serialPort2.Open();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }


            this.BeginInvoke(showMessageChild, "serialconfigure saved");//通知主页配置成功

            //提示保存成功,发送数据到主页,提示设置完成,主页反序列化获得数据
            DialogResult dr = MessageBox.Show("保存成功");//弹出对话框,等待用户确认
            //if (dr == DialogResult.OK) this.Close();
        }

        //发送
        private void button1_Click(object sender, EventArgs e)
        {
            byte[] Txdata=new byte[10];
            if (serialPort2.IsOpen == true)
            {
                Txdata[0] = 0x90;
                try
                {
                    serialPort2 .Encoding = System.Text.Encoding.GetEncoding("GB2312");
                    SerialPortTxdata = textBox1.Text;
                    serialPort2.Write(textBox1.Text);
                    //serialPort2.Write(Txdata ,0,10);

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
             else
            {
                MessageBox.Show("串口未打开", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


          //  if (this.textBox1.InvokeRequired) MessageBox.Show("被其他线程暂用");
           // else MessageBox.Show("没有被其他线程暂用");


        }


        //接收这个是在后台一直保持运行的
        private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //byte[] Buffer = new byte[10];
            //serialPort2.Read(Buffer ,0, serialPort2.ReadBufferSize);

        }


        bool bAccpet = false;
        private Thread getRecevice;
        string strRecieve;

        delegate void DelegateAcceptData();
        delegate void reaction();

        private void testDelegate()
        {
            reaction r = new reaction(fun);
            r();
        }
 
        void fun()
        {
            while (bAccpet)
            {
                AcceptData();
            }
        }
       
        void AcceptData()
        {
            if (textBox2.InvokeRequired)
            {
                try
                {
                    DelegateAcceptData ddd = new DelegateAcceptData(AcceptData);
                    this.Invoke(ddd, new object[] { });
                }
                catch { }
            }
            else
            {
                try
                {
                    strRecieve = serialPort2 .ReadExisting();
                    textBox2.AppendText(strRecieve);
                }
                catch (Exception ex) { }
            }
        }



        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            // SearchSerialComm(serialPort2, listBox1);//获取当前可用的端口号到LISTBOX1,如果没有,提示“当前没有串口可用”
            ComConfig[0].PortName = listBox1.Text;  //获取当前的可用的串口号


        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

            ComConfig[0].DataRate = listBox2.Text;

        }

        private void listBox3_SelectedIndexChanged(object sender, EventArgs e)
        {

            ComConfig[0].ByteCount = listBox3.Text;

        }

        private void listBox4_SelectedIndexChanged(object sender, EventArgs e)
        {

            ComConfig[0].CrcCheck = listBox4.Text;

        }

        private void listBox5_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComConfig[0].StopBitCount = listBox5.Text;
            
        }

        private void listBox6_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComConfig[0].StreamControl = listBox6.Text;
        }


        //是否显示发送
        private void checkBox6_CheckedChanged(object sender, EventArgs e)
        {
            
                ComConfig[0].IsDisplayTxDataForRx = checkBox6.Checked;
        }

        //是否显示时间
        private void checkBox4_CheckedChanged(object sender, EventArgs e)
        {
            ComConfig[0].IsDisplayTimeForRx = checkBox4.Checked;
        }

        //显示是否换行
        private void checkBox5_CheckedChanged(object sender, EventArgs e)
        {

            ComConfig[0].IsAutoHHForRx = checkBox5.Checked;

        }

        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {

            MessageBox.Show("radioButton4");

        }

        private void radioButton5_CheckedChanged(object sender, EventArgs e)
        {


            MessageBox.Show("radioButton5");
        }




        ///字符串转换16进制字节数组
        private byte[] StringToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0) hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);
            return returnBytes;
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {


        }
    }
}

posted @ 2020-08-17 20:43  Jiangxuhua  阅读(121)  评论(0)    收藏  举报