单片机的上位机简单开发(1)

单片机的上位机简单开发(1)

使用的上位机开发工具为Visual Studio 2019
在这里插入图片描述

1.界面设计

1.1创建应用

在这里插入图片描述
在这里插入图片描述

1.2 控件

在Form1.cs(设计)界面下,点右边点击工具箱,找到Label,Button,ComboBox,SerialPort(串口)这四个组件,并且把它拉到设计的窗体下。
在这里插入图片描述
修改控件的text属性,并将ComboBox1右键选择属性,找到DropDownStyle,改为DropDownList(下拉列表),在SerialPort右键选择属性,找到PortName,改为COM
在这里插入图片描述

2.逻辑实现

退出

在这里插入图片描述
增加单击事件的监听

private void button3_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("您是否要退出程序?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                this.Close();
            }
        }

在这里插入图片描述

串口下拉框

在这里插入图片描述
我们需要遍历已经所有串口,只在下拉框中显示出已经连接上单片机的串口,所以我们在运行程序的时候就要读取串口数据,即在Form1_Load编写相应代码

 private void Form1_Load(object sender, EventArgs e)
        {
            //获取端口名字 使用前需要添加 using System.IO.Ports;
            string[] PortName = SerialPort.GetPortNames();
            Array.Sort(PortName);//给端口名称排序
            for (int i = 0; i < PortName.Length; i++)
            {
                comboBox1.Items.Add(PortName[i]);//给comboBox1添加选项
            }
            if (PortName.Length < 1) 
            {
                comboBox1.Items.Add("无可连接的串口");
            }

        }

在这里插入图片描述

波特率下拉框

在这里插入图片描述
在上节代码增加

private void Form1_Load(object sender, EventArgs e)
        {
            //获取端口名字 使用前需要添加 using System.IO.Ports;
            string[] PortName = SerialPort.GetPortNames();
            Array.Sort(PortName);//给端口名称排序
            for (int i = 0; i < PortName.Length; i++)
            {
                comboBox1.Items.Add(PortName[i]);//给comboBox1添加选项
            }
            if (PortName.Length < 1)
            {
                comboBox1.Items.Add("无可连接的串口");
                comboBox2.Items.Add("无可选择波特率的串口");
            }
            else 
            {
                comboBox2.Items.Add("9600");
                comboBox2.Items.Add("115200");
            }
        }
打开串口按钮

首先需要判断2个下拉框的值是否正确,不能是空值或者未连接端口的提示语,在连接成功后,2个下拉框变为不可编辑状态
在这里插入图片描述

private void button1_Click_1(object sender, EventArgs e)
        {
            if ((comboBox1.Text != "" && comboBox1.Text != "无可连接的串口") && (comboBox2.Text != "" && comboBox2.Text != "无可选择波特率"))
            {
                int num = 0;
                num = int.Parse(comboBox2.Text);
                serialPort1.PortName = comboBox1.Text;
                serialPort1.Open();   //打开串口
                serialPort1.BaudRate = num;
                MessageBox.Show("串口已连接", "提示");
                comboBox1.Enabled = false;
                comboBox2.Enabled = false;
            }
            else 
            {
                MessageBox.Show("请检查串口和波特率的选择是否正确", "提示");
            }
        }
关闭串口按钮

串口关闭后,2个下拉框变为可编辑状态

private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            MessageBox.Show("串口已关闭", "提示");
            comboBox1.Enabled = true;
            comboBox2.Enabled = true;
        }
### C语言在单片机上位机软件开发中的应用 #### 头文件的合理组织管理 对于C语言编写的嵌入式应用程序而言,头文件的有序排列有助于提高代码可读性和维护性。推荐按照稳定度来排序头文件[^1]: ```cpp #include <stdio.h> // C标准库头文件 #include <string.h> // C标准库头文件 #include <vector> // C++标准库头文件 #include "platform_defines.h"// 平台定义头文件 #include "third_party_libs.h"// 第三方库头文件 #include "base_types.h" // 自己编写的基础全局头文件 #include "utils.h" // 自己编写的工具函数头文件 #include "project_config.h" // 当前项目的配置头文件 ``` 这种结构不仅便于开发者快速定位所需的功能模块,而且减少了不同版本间兼容性的风险。 #### 数据处理机制实例分析 当涉及到实时数据采集时,在特定条件下触发事件是一种常见做法。例如,在基于DSP28335芯片设计的应用场景里,通过设定计数器`n_pso`并配合固定频率(如5kHz)中断服务例程实现周期性任务调度[^2]: ```cpp volatile unsigned int n_pso = 0; void ISR_Timer() { n_pso++; if (n_pso >= 250) { n_pso = 0; function(); // 执行具体业务逻辑 } } ``` 此方法能够有效减少CPU占用率的同时保持较高的响应速度。 #### 实际案例解析——环境监测系统 考虑一个简单的智能家居控制系统,它利用Arduino板卡完成室内外温湿度监控工作。以下是简化版的核心代码片段展示如何初始化硬件资源及循环查询传感器状态并向串口输出结果[^3]: ```cpp #define TEMPERATURE_MAX 40 // 设置最高允许温度 class FlowerController { public: void Initialization(); void process(int temp); void printStatus(); }; FlowerController flower; void setup() { Serial.begin(115200); // 初始化串行通信接口 flower.Initialization(); // 启动控制器及相关外设 } void loop() { static int currentTemp = 25;// 假定当前温度值 flower.process(currentTemp); flower.printStatus(); delay(500); // 暂停一段时间再继续下一个轮询周期 } ``` 上述例子展示了从设备启动到持续运行期间所涉及的主要流程控制要点。 #### 用户界面交互优化技巧 针对某些应用场景可能存在的特殊需求,比如支持多种编码格式的选择,则可以在GUI界面上增加相应选项供用户灵活切换。尽管这部分并非严格意义上的核心功能部分,但在实际产品中却能显著提升用户体验质量[^4]. ```cpp enum EncodingType {HEX, ASCII}; EncodingType selectedMode = HEX; bool handleUserInput(char* inputBuffer){ switch(selectedMode){ case HEX : // 对应于十六进制模式下的输入处理逻辑... break; case ASCII : // 针对ASCII字符集的操作实施细节... break; default: ; } return true; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值