vs2019制作一个温度上位机

本文介绍了如何使用Visual Studio 2019创建一个Windows窗体应用,作为温度上位机。详细步骤包括添加控件如button、label等,设置串口通信参数,以及解释了串口通信的基础知识如波特率、数据位、奇偶校验位和停止位。最终实现了通过SerialPort进行数据读取的功能。
摘要由CSDN通过智能技术生成

使用的软件是:Visual Studio 2019

打开vs2019,选择创建一个新项目,点击下一步:

搜索“窗体”,找到“Windows窗体应用(.NET Framework)”w项目,点击下一步: 

更改项目名称和位置(可不做更改),最后点击创建:

最后生成这样一个界面:

然后修改窗口的名字,点击窗口,在右侧属性里找到“Text”,修改文字:

2、在窗口中添加控件

点击左侧的工具箱,并搜索添加button、label、comboBox、GroupBox、panle和serialPort这几个控件:

在添加的控件上点击右键,进入属性,找到“Text”属性,将button1~button3改成搜索串口、打开串口和关闭串口;将label1~label6改为串口号、波特率、校验位、数据位和停止位; 

点击,并添加波特率元素:

接下来,双击搜索串口按钮,进入到Form1.cs进行编程:

在该事件下面编写下面程序,搜索并获取当前可用的串口:

public Form1()
        {
            InitializeComponent();
            serialPort1.DataReceived += SerialPort1_DataReceived;    //订阅串口

            greenhouse.RequestSendData += SendDate;

           
        }

        void SendDate(byte [] data)
        {
            serialPort1.Write(data, 0, data.Length);
        }

        private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //Console.WriteLine("串口接收事件");
            //获取接收缓冲区中的字节个数
            int n = serialPort1.BytesToRead;
            byte[] data = new byte[n];
            if(n > 0)
            {
                serialPort1.Read(data, 0, n);
                UserRecSerialPortData(data);
                greenhouse.ReceivedRawData(data);


            }
        }

        SerialPort serialP
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于STC89C52单片机的串口通信和定时器实验代码: ```c #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit LED1 = P1^0; // LED1连接的IO口 sbit LED2 = P1^1; // LED2连接的IO口 sbit BUZZER = P1^2; // 蜂鸣器连接的IO口 sbit KEY0 = P3^2; // KEY0连接的IO口 uchar receivedData; // 用于存储接收到的字符 // 定时器6初始化函数 void initTimer6() { TMOD &= 0xF0; // 将T0模式设置为0 TMOD |= 0x01; // 将T0模式设置为1 TL0 = 0x70; // 设置定时器初值低字节 TH0 = 0xFC; // 设置定时器初值高字节 TR0 = 1; // 启动定时器 } // 串口初始化函数 void initSerial() { SCON = 0x50; // 设置串口工作模式 TMOD &= 0x0F; // 将T1模式设置为0 TMOD |= 0x20; // 将T1模式设置为1 TH1 = 0xFD; // 设定波特率为9600bps TL1 = 0xFD; ET1 = 0; // 关闭T1中断 ES = 1; // 打开串口中断 EA = 1; // 打开总中断 } // 串口发送一个字符 void sendChar(uchar ch) { SBUF = ch; while(TI == 0); TI = 0; } // 串口发送一个字符串 void sendString(uchar *str) { while(*str) { sendChar(*str++); } } // 串口中断服务函数 void serialInterrupt() interrupt 4 { if(RI) { // 接收中断 receivedData = SBUF; // 读取接收到的数据 RI = 0; // 清除接收中断标志 } } // 延时函数 void delay(uint time) { uint i, j; for(i = time; i > 0; i--) { for(j = 110; j > 0; j--); } } // 主函数 void main() { P1 = 0x00; // 将P1口初始化为输出模式 P3 |= 0x04; // 将P3.2口初始化为输入模式 initSerial(); // 初始化串口 initTimer6(); // 初始化定时器6 while(1) { if(receivedData == 'A') { LED1 = ~LED1; // LED1闪烁 } else if(receivedData == 'B') { LED2 = ~LED2; // LED2闪烁 } else if(receivedData == 'D') { LED1 = ~LED1; LED2 = ~LED2; // LED1和LED2一起闪烁 } else if(receivedData == 'P') { BUZZER = 1; // 蜂鸣器响 } else if(receivedData == 'M') { BUZZER = 0; // 蜂鸣器停止 } if(KEY0 == 0) { // 检测按键是否按下 delay(10); // 稍微延时一下,防止按键抖动 if(KEY0 == 0) { // 再次确认按键是否按下 sendString("123456789\n"); // 发送学号到上位机 } } } } // 定时器中断服务函数 void timer6Interrupt() interrupt 13 { static uchar count = 0; // 静态变量,每次调用函数都保留上一次的值 TH0 = 0xFC; // 设置定时器初值高字节 TL0 = 0x70; // 设置定时器初值低字节 count++; // 计数器加1 if(count == 20) { // 计数器到达20时,代表定时2秒钟 count = 0; // 计数器清零 LED0 = ~LED0; // LED0亮灭一次 sendString("123456789\n"); // 发送学号到上位机 } } ``` 需要注意的是,上述代码中的串口波特率为9600bps,而定时器6的计时时间为2秒,因此波特率和计时时间可以根据实际需要进行调整。另外,由于单片机的串口通信需要与上位机配合,因此需要在上位机端设置好对应的串口参数、打开串口等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_69107688

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值