从0开始的WinForm串口+4路温度采集上位机实战

什么是WinForm?

WinForm是·Net开发平台中对Windows Form的一种称谓。

为什么用WinForm?

对比于常用的工具LabView拥有无需额外部署环境、方便连接数据库等第三方接口、面向对象编程语言带来的减少重复造轮子的特性(以及无聊)

为什么写这篇文章?

其实就是我想安利一下(用爱发电),而且我当时学的时候网上完整的教材不是很多所以不想后来的人走自己的老路

使用何种编译器?

VS2017微软官网就有,也不收费,可以自行下载

使用何种编程语言?

C#,长得很像Java,难度也很像Java(贼简单),会C语言的基本学习2小时后可以无障碍阅读

其实我也就是个小菜鸡,如果有什么不对的地方还请多多指正

扫描二维码关注公众号,回复: 5535553 查看本文章

----------------------------------------------------分割线--------------------------------------------------

一、新建工程及控件布局

    1.依照以下步骤建立工程

             

    名字随意,路径随意,解决方案最好英文(其实也是随意)

    2.窗口右侧的解决方案,右键将主窗体Form1改名为:“FrmMain”,然后双击窗体文件进入设计器

                                                  

    3.在设计器里将控件按以下顺序布置好并改名

                  

相关控件:

(按键控件)(标签)(文字框)

这些控件都有一个Text属性,调用此属性相当于调用了一个string字符串变量

调用方法为:控件名.Text(例如string Str=btn_Star.Text;)

(下拉框)

下拉框需要设置属性(就是显示内容),在Items条目下点击右侧的”…”进入设置

                                                  

将你需要的数据填充到数据框里,填充界面如下,除了串口名称外都需要填充,串口名称由于需要检测那些串口可用在后面会使用代码的方式填充

                           

添加串口控件,并改名ObjPort

二、添加控件服务

(通过在设计器里双击按键可以快速添加按键按下的服务方法。)

1. 添加“连接”按钮方法

在方法内部复制下列代码:

if (btn_Switch.Text == "连接")
{
     if (Start(false, cmb_PortName.SelectedItem.ToString(), cmb_BaudRate.SelectedItem.ToString(), cmb_PortData.SelectedItem.ToString(), cmb_PortStop.SelectedItem.ToString(), cmb_PortParity.SelectedItem.ToString()) == true)
   {
        btn_Switch.Text = "断开";
        MessageBox.Show("连接成功", "提示:");
        lbl_PortState.Text = cmb_PortName.SelectedItem.ToString() + " 已连接";
    }
   }
    else if (btn_Switch.Text == "断开")
   {
       if (Start(true, cmb_PortName.SelectedItem.ToString(), cmb_BaudRate.SelectedItem.ToString(), cmb_PortData.SelectedItem.ToString(), cmb_PortStop.SelectedItem.ToString(), cmb_PortParity.SelectedItem.ToString()) == true)
       {
           btn_Switch.Text = "连接";
           MessageBox.Show("断开成功", "提示:");
           lbl_PortState.Text = cmb_PortName.SelectedItem.ToString() + " 可用";
       }
}

相关方法(就是函数,C#叫方法)

MessageBox();

MessageBox是WinForm中的提示弹窗方法,其参数为:(“提示内容”,”标题”);    效果如下:

                           

Start();为自建串口连接方法,方法原型如下:按顺序填充以下参数可以即可调用方法

(是否连接、串口名、波特率、数据位、停止位、校验位)如果打开成功会返回ture,如果打开失败会终止并返回false

代码如下,复制到程序任意位置即可

private bool Start(bool IsLinked, string PortName, string Rate, string PortData, string PortStop, string PortParity)
        {
            if (IsLinked == false)//串口处于关闭状态
            {
                try
                {
                    ObjPort.PortName = PortName;
                    ObjPort.BaudRate = Convert.ToInt32(Rate);
                    ObjPort.DataBits = Convert.ToInt32(PortData);//数据位处理方法
                    switch (PortStop)//停止位
                    {
                        case "0": ObjPort.StopBits = StopBits.None; break;
                        case "1": ObjPort.StopBits = StopBits.One; break;
                        case "1.5": ObjPort.StopBits = StopBits.OnePointFive; break;
                        case "2": ObjPort.StopBits = StopBits.Two; break;
                    }
                    switch (PortParity)//奇偶校验位
                    {
                        case "0": ObjPort.Parity = System.IO.Ports.Parity.None; break;
                        case "1": ObjPort.Parity = System.IO.Ports.Parity.Odd; break;
                        case "2": ObjPort.Parity = System.IO.Ports.Parity.Even; break;
                        case "3": ObjPort.Parity = System.IO.Ports.Parity.Mark; break;
                        case "4": ObjPort.Parity = System.IO.Ports.Parity.Space; break;
                    }
                    ObjPort.Open();
                    return true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("连接发生错误:" + ex.Message);
                    return false;
                }
            }
            else
            {
                ObjPort.Close();
                return true;
            }
        }

2.  串口号自检测方法以及默认数据选择方法

复制如下代码到主程序的任意位置

(串口自检测)

private void PortInit()
        {
            string[] portList = System.IO.Ports.SerialPort.GetPortNames();
            cmb_PortName.Items.Clear();
            if (portList.Length <= 0)
            {
                cmb_PortName.Items.Add("无串口");//填充下拉框对象
            }
            else
            {
                for (int i = 0; i < portList.Length; ++i)
                {
                    string name = portList[i];
                    cmb_PortName.Items.Add(name);
                }
            }
        }

(默认数据选择)

        private void SelectId()
        {
            cmb_PortName.SelectedIndex = 0;
            cmb_BaudRate.SelectedIndex = 5;
            cmb_PortData.SelectedIndex = 2;
            cmb_PortParity.SelectedIndex = 0;
            cmb_PortStop.SelectedIndex = 1;
            lbl_PortState.Text = cmb_PortName.SelectedItem.ToString() + "  可用";
        }

控件相关:

下拉框的SelectedIndex属性表示其选中的数据在数据集中的位置,可以赋值int型数据

将这些方法添加到初始化程序中

同时为“刷新状态”按钮添加这两个方法作为服务方法(同“连接”按钮)

3.       添加发送和接收服务

    I. 发送服务:为发送按钮添加如下事件:

ObjPort.Write(txt_Send.Text);

Write方法为官方串口库中的数据发送方法,参数为string字符串

    II. 添加接收方法

由于接收方法需要使用额外的线程,顾需要使用特殊的方法添加—右键“ObjPort控件”—“属性”在里面选择中“服务”(闪电标记),双击接收服务为期添加方法

                                               

由于设计时考虑到数据安全问题,WinForm程序并不能直接在UI线程调用其他线程的数据,所以需要在程序中添加一句

Control.CheckForIllegalCrossThreadCalls = false;

来解除线程屏蔽。

然后将串口接收到的数据赋值给接收框(这里一定要用“+=”否则无法连续显示数据)

txt_Rec.Text += ObjPort.ReadExisting();

----------------------------------------------------分割线--------------------------------------------------

大功告成,一个简易串口就这样完成了,点击启动或者按F5进行编译

                    

                               

在运行无错误后可以在工程目录下找到的bin文件夹中找到生成的exe文件,这个exe文件可以在任意windows电脑中直接运行

                                  

如果你只是想了解一下如何使用编写串口,到这里就可以了;如果你还想接着看“基于Winform的4路温度上位机”可以等接下来的文章

                   

丢个图跑了

猜你喜欢

转载自blog.csdn.net/weixin_37878740/article/details/79997281