您现在的位置是:首页 > 短信大全

如何用C#写一个简易的上位机

作者:往北时间:2024-03-29 14:15:57分类:短信大全

简介  文章浏览阅读8.7k次,点赞39次,收藏262次。完成上面之后,回到界面,把箭头指向,停止位的comboBox,右键打开属性,找到ltems(集合)点击右边的(...)打开编辑器,在里面输入下面的数据(复制就行,他会自动排序)打开TextBox的属性,在Bac

点击全文阅读

上位机的界面如下

 有点不好看,自己可以按照自己的来设计,这里着重功能的实现

直接上代码,打开VS新建项目,选择Windows窗口应用(NET。Framework)创建好项目

 选择视图,打开工具箱(快捷键 Ctrl + Alt + x)

 在工具箱中,输入GroupBox ,拖拽到界面中,调节合适的大小,把箭头指向GroupBox的框架,

 右键打开属性界面,在Text中改写显示在界面的文字,然后在Font中改变字体的大小

 再次打开工具箱,输入ladel,拖拽6个过来界面上,依次按上面的操作把Text改成对应的名字

 打开工具箱,输入comboBox,拖拽5个过来界面上,依次对应每一个

 在工具箱中输入serialPort ,拖拽过来界面上,就会出现一下的界面,用了获取串口的信息

双击窗口空白处,也可以右键进入代码界面

 添加方法text_Serial_port()来获取电脑的串口,然后在Form1_load中调用方法,

 private void text_Serial_port()        {            string[] ports = System.IO.Ports.SerialPort.GetPortNames(); //获得可用的串口            for (int i = 0; i < ports.Length; i++)            {                comboBox1.Items.Add(ports[i]);            }            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//如果里面有数据,显示第0个        }
private void Form1_Load(object sender, EventArgs e)        {            text_Serial_port();        }

运行一下就有以下界面,如果出现右边的界面,说明电脑上没有虚拟串口,可以查询虚拟串口,有相关的资源

 完成上面之后,回到界面,把箭头指向,停止位的comboBox,右键打开属性,找到ltems(集合)点击右边的(...)打开编辑器,在里面输入下面的数据(复制就行,他会自动排序)

 

 停止位:


1.5
2

数据位:

8
7
6
5

 波特率:

1382400921600460800256000230400128000115200768005760043000384001920014400960048001200

奇偶校验:


奇校验
偶校验

全部输入后,运行以下画面

 在代码中添加初始化方法,并在然后在Form1_load中调用方法,运行以下结果

            private void Form1_Load(object sender, EventArgs e)        {            text_Serial_port();            Initialization();        }        //初始化        private void Initialization()        {            comboBox2.Text = "1";            comboBox3.Text = "8";            comboBox4.Text = "115200";            comboBox5.Text = "奇校验";        }

 

 打开工具箱,输入Button,找到并拖进界面中,调整大小,并在属性中的Text中改写成(打开串口)

 

 把箭头指向Button,双击进入代码界面,在其中添加Button方法,即可打开串口

 //串口的开关        private void button1_Click(object sender, EventArgs e)        {            if (button1.Text == "打开串口")            {                try                {                    serialPort1.PortName = comboBox1.Text;//获取要打开的串口                    serialPort1.BaudRate = int.Parse(comboBox4.Text);//获得波动率                    serialPort1.DataBits = int.Parse(comboBox3.Text);//获得数据位                    //设置停止位                    if (comboBox2.Text == "1")                    {                        serialPort1.StopBits = StopBits.One;                    }                    else if (comboBox2.Text == "1.5")                    {                        serialPort1.StopBits = StopBits.OnePointFive;                    }                    else if (comboBox2.Text == "2")                    {                        serialPort1.StopBits = StopBits.Two;                    }                    //设置奇偶校验                    if (comboBox5.Text == "无")                    {                        serialPort1.Parity = Parity.None;                    }                    else if (comboBox5.Text == "奇校验")                    {                        serialPort1.Parity = Parity.Odd;                    }                    else if (comboBox5.Text == "偶校验")                    {                        serialPort1.Parity = Parity.Even;                    }                    serialPort1.Open();//打开串口                    button1.Text = "关闭串口";                }                catch (Exception err)                {                    MessageBox.Show("打开失败" + err.ToString(), "提示!");                }            }            else            {                //关闭串口                try                {                                            serialPort1.Close();//关闭串口                }                catch (Exception) { }                button1.Text = "打开串口"; //按钮显示打开            }        }

 在工具箱中输入TextBox,拖到界面中,点击组件上面的小箭头,把MultiLine勾上,然后调节大小

 打开TextBox的属性,在BackColor中调节画面的颜色,在ForeColor中调节字体的颜色,这里我界面选择的是黑色,字体选择的是蓝色

 

 将鼠标箭头指向serialPort右键打开属性,在属性页面点击那个闪电一样,在下面找到DataReceived

 

 双击进入代码界面,加入接收信息的方法

//读取并显示接收的信息        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            int len = serialPort1.BytesToRead; //获取可以读取的字节数            byte[] buff = new byte[len];            serialPort1.Read(buff, 0, len);//把数据读取到数组中            string reslut = Encoding.Default.GetString(buff);            //将byte值根据为ASCII值转为string            Invoke((new Action(() =>            {                //还应该添加16制转化                textBox1.AppendText(" " + reslut);     //追加显示在界面上                    }            )));        }

下载一个虚拟助手XCOM测试一下效果,打开串口一个是COM1,一个是COM3,发送数据,观察是否数据显示

接下来添加清除数据和16进制显示,在工具箱中查找CheckBox,拖拽到界面中,并且把Text改成“16进制显示”

 在代码中添加16进制的方法,并且在刚才的 serialPort1_DataReceived中 的if中添加上判断

 //16进制显示字符串        private string byteToHexstr(byte[] buff)        {            string str = "";            try            {                if (buff != null)                {                    for (int i = 0; i < buff.Length; i++)                    {                        //char a = (char)buff[i];                        //str += a.ToString();                        str += buff[i].ToString("x2");                        str += " ";//两个之间用空格                    }                    //str = new string(buff);                    return str;                }            }            catch (Exception)            {                return str;            }            return str;        }

 if的判断ceh

//读取并显示接收的信息        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            int len = serialPort1.BytesToRead; //获取可以读取的字节数            byte[] buff = new byte[len];            serialPort1.Read(buff, 0, len);//把数据读取到数组中            string reslut = Encoding.Default.GetString(buff);            //将byte值根据为ASCII值转为string            Invoke((new Action(() =>            {                if (checkBox1.Checked)//16进制转化                {                    textBox1.AppendText(" " + byteToHexstr(buff));                }                else                {                    textBox1.AppendText(" " + reslut);                }            }            )));        }

 测试:在虚拟串口助手中勾上16进制发送,01 02 03 04 05 ,在上位机中勾上16进制显示

显示成功后,在工具箱中找到Button拖拽过来界面,Text改成“清除数据”,双击添加方法

//清除接收        private void button2_Click(object sender, EventArgs e)        {            textBox1.Clear();         }   

 添加发送信息的功能

从工具箱中找到TextBox并拖拽到界面,找到CheckBox改名成16进制发送 并添加两个Button改名为“发送信息”和”清除数据“

 添加1字符串转化16进制的方法

        //字符串转16进制        private byte[] strToHexbytes(string str)        {            str = str.Replace(" ", "");//清除空格            byte[] buff;            if ((str.Length % 2) != 0)            {                buff = new byte[(str.Length + 1) / 2];                try                {                    for (int i = 0; i < buff.Length; i++)                    {                        buff[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);                    }                    buff[buff.Length - 1] = Convert.ToByte(str.Substring(str.Length - 1, 1).PadLeft(2, '0'), 16);                    return buff;                }                catch (Exception err)                {                    MessageBox.Show("含有f非16进制的字符", "提示");                    return null;                }            }            else            {                buff = new byte[str.Length / 2];                try                {                    for (int i = 0; i < buff.Length; i++)                    {                        buff[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);                    }                    //buff[buff.Length - 1] = Convert.ToByte(str.Substring(str.Length - 1, 1).PadLeft(2, '0'), 16);                }                catch (Exception err)                {                    {                        MessageBox.Show("含有非16进制的字符", "提示");                        return null;                    }                }            }            return buff;        }

添加发送信息的方法,并且双击Button3进入代码界面添加事件

        private void button3_Click(object sender, EventArgs e)        {                            Task.Run(() => {                    send_();                });        }        string data_;        //发送数据          private void send_()        {            data_ = textBox2.Text.ToString();                try                {                    if (data_.Length != 0)                    {                        data_ += " ";                        if (checkBox2.Checked) //16进制发送                        {                            serialPort1.Write(Encoding.Default.GetString(strToHexbytes(data_)));                        }                        else                        {                            serialPort1.Write(data_);                            //byte[] byteArray = Encoding.Default.GetBytes(shuju);//Str 转为 Byte值                            //serialPort1.Write(byteArray, 0, byteArray.Length, 0, null, null); //发送数据                                 }                    }                }                catch (Exception) { }                 }

最后添加清除数据的方法

        //清除数据        private void button4_Click(object sender, EventArgs e)        {            textBox2.Clear();        }

到此,一个简易的上位机就做好了,有什么不足还请大佬指出。

点击全文阅读

郑重声明:

本站所有活动均为互联网所得,如有侵权请联系本站删除处理

我来说两句