首页>>论坛 >>技术论坛 >>网络与通信
|
我要发帖  | 我要投票  | 我要回复  | 收藏
1

C#开发的串行助手 版本:V2.01

C#开发的串行助手 版本:V2.01
 
 

更新时间:2010年5月21日

主要更改内容如下:

1)操作界面做的大幅度的调整。

2)增加了自动枚举COM口号功能,更新串口时不必重启软件,软件自动搜索串口。

3)键盘监听按键做了状态指示,并且增加了锁定焦点的功能,消除了按下方向导航键或者单击鼠标后焦点跑飞的可能。

4)增加了“字符格式显示”和“十六进制显示”两个单选项,接收信息区不再采用字符和十六进制同时显示的形式。

5)增加了清除发送信息区功能,一键清除发送信息区。

6)接收信息区加入了“显示最后一行”功能,方便观察即时信心,不需要拖动滚动条。

7)去除了“更新设备参数”功能。

 

苏龙串口助手V2.01版本界面如下:

图片

 

 
相关主题
回复 链接 收藏
 
回复:C#开发的串行助手 版本:V2.01
 

源代码:

­Forml.CS

namespace SerialPorts
{
    public partial class Form1 : Form
    {
        private byte[][] _buffer;
        private bool _inRead = true;
        private bool _inSend;
        private bool _inAutoSend = false;
        private bool _isCycle;
        private string _portName;
        private bool _btnKeyFousflag=false;
        private bool _sendAsHex;
        private string[] _sendData;
        private Encoding _sendEncoding = Encoding.ASCII;
        private SerialPort _serialPort;
        private int _sleepTime = 500;
        //private Thread _thCheckStatus;
        private Thread _thRead;
        private Thread _thSendData;
        private int _keyMatchCount = 0;
        private Queue<byte[]> _keyDatas = new Queue<byte[]>();

        private List<KeyBindData> _keyList = new List<KeyBindData>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
         
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            radioButtonString.Checked = true;
            btnKeyFous.Text = "已解除键盘监听";
            btnKeyFous.ForeColor = System.Drawing.Color.Red;
            tbxReadData.Text = "使用说明:                                                                                                                                                                   1)本串行调试助手能给键盘上任意一个按键绑定一个值,以实现按键按下去时发送指定的值。                                                                                          2)通过设置发送间隔的时间可以实现键值连续发送或者单次发送。                                                                                                                  3)可以保存键值设置和读出键值设置,使用方便!                                                                                                                                 4)使用键值绑定发送功能时,请点击左下角的按钮锁定焦点。                                                                                                                      5)本版本的方向键无法绑定键值!                                                                                                                                                                                                                                                                                                                                                                                                                        本店供应全双工蓝牙串口模块,无线串行数据收发,解决线缆通讯干扰,传输距离更远。设备                                                                                      间数据无线收发、无线遥控、机器人制作必不可少

 
回复 链接 收藏
 
回复:C#开发的串行助手 版本:V2.01
 

本店供应全双工蓝牙串口模块,无线串行数据收发,解决线缆通讯干扰,传输距离更远。设备                                                                                      间数据无线收发、无线遥控、机器人制作必不可少!                                                                                                                                    无线USB通讯、无线串行通讯,了解详情请进入:http://shop59304983.taobao.com             ";
            tbxData.Text = "";
            btnUpdateSet.Hide();
            richTextBox1.Text = "苏龙电子配件店:http://shop59304983.taobao.com";
            foreach (var s in SerialPort.GetPortNames())
            {
                cbxCom.Items.Add(s);
            }
            cbxTencoding.SelectedIndex = 0;
        }

        private void cbxCom_SelectedIndexChanged(object sender, EventArgs e)
        {
            var comboBox = ((ComboBox) sender);
            if (comboBox.SelectedIndex == -1)
            {
                return;
            }
            _portName = comboBox.SelectedItem.ToString();
           

            if (_thSendData != null)
            {
                _inSend = false;
                _inAutoSend = false;
                try
                {
                    _thSendData.Abort();
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception);
                }
            }

            if (_thRead != null)
            {
                _inRead = false;
                try
                {
                    _thRead.Abort();
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception);
                }
            }

            if (_serialPort != null)
            {
                _serialPort.Close();
            }

            try
            {
                LoadPortDefault();
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
            InitPort();

            _thRead = new Thread(ReadData);
            //_thCheckStatus.Start();
            _inRead = true;
            _thRead.Start();
            _thSendData = new Thread(SendData);
            _inSend = true;
            _thSendData.Start();
        }

        private Encoding GetSendEncoding()
        {
            switch (cbxTencoding.SelectedIndex)
            {
                case 0:
                    return Encoding.ASCII;
                case 1:
                    return Encoding.BigEndianUnicode;
                case 2:
                    return Encoding.Default;
                case 3:
                    return Encoding.Unicode;
                case 4:
                    return Encoding.UTF32;
                case 5:
                    return Encoding.UTF7;
                case 6:
                    return Encoding.UTF8;
            }
            return Encoding.ASCII;
        }

        private SerialPort InitPort()
        {
            if (string.IsNullOrEmpty(_portName))
            {
                throw new NoNullAllowedException(@"串口名称不能为空!");
            }
            _serialPort = new SerialPort(_portName);
            _serialPort.Open();
            return _serialPort;
        }
        /*****************************************************************************/
        //更新设备参数
        /*****************************************************************************/
       /* private void SetPort()
        {
            _serialPort.BaudRate = int.Parse(cbxBaudRate.SelectedItem.ToString());
            _serialPort.BreakState = cbxBreakState.SelectedIndex == 0;
            _serialPort.DataBits = int.Parse(cbxDataBits.SelectedItem.ToString());
            _serialPort.DiscardNull = cbxDiscardNull.SelectedIndex == 0;
            //_serialPort.Encoding = Encoding.GetEncoding(cbxEncoding.SelectedItem.ToString());
            _serialPort.Handshake = (Handshake) Enum.Parse(typeof (Handshake), cbxHandshake.SelectedItem.ToString());
            _serialPort.Parity = (Parity) Enum.Parse(typeof (Parity), cbxParity.SelectedItem.ToString());
            //_serialPort.PortName = _portName;
            _serialPort.ReadTimeout = (int) numReadTimeout.Value;
            _serialPort.WriteTimeout = (int) numWriteTimeout.Value;
            _serialPort.RtsEnable = cbxRtsEnable.SelectedIndex == 0;
            _serialPort.StopBits = (StopBits) Enum.Parse(typeof (StopBits), cbxStopBits.SelectedItem.ToString());
            _serialPort.DtrEnable = cbxDtrEnable.SelectedIndex == 0;
        }
        */
        private void LoadPortDefault()
        {
            if (string.IsNullOrEmpty(_portName))
            {
                throw new NoNullAllowedException(@"串口名称不能为空!");
            }
            using (_serialPort = new SerialPort(_portName))
            {
                _serialPort.Open();
                InitCbxSelected(cbxBaudRate, _serialPort.BaudRate);

                cbxBreakState.SelectedIndex = _serialPort.BreakState ? 0 : 1;

                InitCbxSelected(cbxDataBits, _serialPort.DataBits);

                cbxDiscardNull.SelectedIndex = _serialPort.DiscardNull ? 0 : 1;

                //InitCbxSelected(cbxEncoding, _serialPort.Encoding.EncodingName);

                InitCbxSelected(cbxHandshake, _serialPort.Handshake);
                InitCbxSelected(cbxParity, _serialPort.Parity);

                numReadTimeout.Value = _serialPort.ReadTimeout;
                numWriteTimeout.Value = _serialPort.WriteTimeout;
                cbxRtsEnable.SelectedIndex = _serialPort.RtsEnable ? 0 : 1;

                InitCbxSelected(cbxStopBits, _serialPort.StopBits);

                cbxDtrEnable.SelectedIndex = _serialPort.DtrEnable ? 0 : 1;
            }
        }

        private static void InitCbxSelected(ComboBox cbx, object value)
        {
            if (value == null)
            {
                return;
            }
            var isMatch = false;
            for (var i = 0; i < cbx.Items.Count; i++)
            {
                if (value.ToString() == cbx.Items[i].ToString())
                {
                    cbx.SelectedIndex = i;
                    isMatch = true;
                }
            }
            if (!isMatch)
            {
                cbx.Items.Add(value.ToString());
                cbx.SelectedIndex = cbx.Items.Count - 1;
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (cbxCom.SelectedIndex == -1)
            {
                MessageBox.Show(@"请选择串口");
                return;
            }
            _sleepTime = (int) numSleep.Value;
            _sendData = tbxData.Text.Split(new[] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
            _isCycle = cbxCycle.Checked;
            _sendEncoding = GetSendEncoding();
            _sendAsHex = cbxHex.Checked;
            _buffer = new byte[_sendData.Length][];
            if (_sendAsHex)
            {
                for (var j = 0; j < _sendData.Length; j++)
                {
                    var str = _sendData[j];
                    if (str.Length%2 != 0)
                    {
                        str = '0' + str;
                    }
                    _buffer[j] = new byte[str.Length/2];
                    var bindex = 0;
                    for (var i = 0; i < str.Length; i += 2)
                    {
                        var temp = str.Substring(i, 2);
                        _buffer[j][bindex++] = byte.Parse(temp, NumberStyles.HexNumber);
                    }
                }
            }
            else
            {
                for (var j = 0; j < _sendData.Length; j++)
                {
                    _buffer[j] = _sendEncoding.GetBytes(_sendData[j]);
                }
            }

            if (!_inAutoSend)
            {
                //InitPort();
                _inAutoSend = true;
                btnSend.Text = @"停止(&S)";
            }
            else
            {
                _inAutoSend = false;
                //try
                //{
                //    _thSendData.Join();
                //}
                //catch (Exception exception)
                //{
                //    Console.WriteLine(exception);
                //}
                btnSend.Text = @"发送(&S)";
            }
        }

        //private void CheckStatus()
        //{
        //    try
        //    {
        //        while (_serialPort != null && _inSend)
        //        {
        //            this.Invoke(new EventHandler(delegate
        //                                             {
        //                                                 lblBytesToRead.Text = _serialPort.BytesToRead.ToString();
        //                                                 lblBytesToWrite.Text = _serialPort.BytesToWrite.ToString();
        //                                                 lblCDHolding.Text = _serialPort.CDHolding.ToString();
        //                                                 lblDsrHolding.Text = _serialPort.DsrHolding.ToString();
        //                                                 lblIsOpen.Text = _serialPort.IsOpen.ToString();
        //                                             }));
        //            Thread.Sleep(500);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        this.Invoke(new EventHandler(delegate { MessageBox.Show(ex.ToString()); }));
        //    }
        //    finally
        //    {
        //        this.Invoke(new EventHandler(delegate { lblIsOpen.Text = @"False"; }));
        //    }
        //}

        private void SendData()
        {
            try
            {
                //_serialPort.Open();
         &

 
回复 链接 收藏
 
RE:C#开发的串行助手 版本:V2.01
 
无线USB通讯、无线串行通讯,了解详情请进入:http://shop59304983.taobao.com
 
回复 链接 收藏
 
我要发帖  | 我要投票  | 我要回复  | 收藏
1