IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> C#上位机(数据校验发送指令来控制下位机) -> 正文阅读

[嵌入式]C#上位机(数据校验发送指令来控制下位机)

对于“数据校验发送指令来控制下位机”的上位机,该模块主要有三个;
(1)串口扫描,获取串口号,通过打开按钮来控制按钮是否打开。
(2)发送数据校验的函数,将数据发送个给相应的下位机和硬件设备。
(3)接收下位机的反馈状态。取反校验。
(4)定时器来简单直观的显示下位机是否将反馈信息发送出来,上位机有没有发送数据给下位机和接收到下位机的数据。
(5)定时器来显示状态还是不够显示,由visual basic power控件来显示更加直观。

1.窗体设计,这块涉及到visual basic power控件,如果自己的编译器没有,我之前的博客中有解决办法。
在这里插入图片描述
2.打开串口设计
2.1 扫描串口,详解见之前的串口控制上位机设计。通过扫描串口,可以获取电脑上可用的串口

public Form1()
{
   InitializeComponent();
   //扫描串口信息,为了之后方便使用,此处进行封装一个串口扫描的函数
   SearchAndSerialComboBox(serialPort1, comboBox1);

}
private void SearchAndSerialComboBox(SerialPort MyPort, ComboBox MyBox)
{
   //定义一个内存缓存变量
   string Buffer;
   //清空ComboBox下拉控件内容
   MyBox.Items.Clear();
   //遍历20个串口
   for (int i = 1; i < 20; i++)
   {
       //如果运行成功,就将相应的串口信息添加至ComboBox。
       try
       {
           //将读取的串口信息存在内存中
           Buffer = "COM" + i.ToString();
           //将内存中的串口信息给相应的控件
           MyPort.PortName = Buffer;
           //打开串口如果运行失败,后面的代码就不执行了,直接跳转至catch。
           MyPort.Open();
           //将获取的串口添加到ComboBox
           MyBox.Items.Add(Buffer);
           //关闭串口
           MyPort.Close();
       }
       catch
       {
       }
   } 
}

2.2 打开串口和关闭串口在一个按钮上同时可以实现。

private void button1_Click(object sender, EventArgs e)
{
   if (serialPort1.IsOpen)
   {
       try
       {
           serialPort1.Close();
           button1.Text = "打开串口";
       }
       catch
       { 
       }
      
   }
   else
   {
       try
       {
           //这块一定要获取串口号
           serialPort1.PortName = comboBox1.Text;
           serialPort1.Open();
           button1.Text = "关闭串口";
       }
       catch
       {
           MessageBox.Show("串口打开失败", "提示");
       }     
   }
}

3.发送数据校验的函数,由于N0.1、N0.2和N0.3三个组合中,发送数据校验的按钮作用都一样,因此在这进行了一个函数封装。
3.1 Form1.Designer.cs中的按钮属性都要进行修改。

this.button2.Click += new System.EventHandler(this.button_Click);
this.button3.Click += new System.EventHandler(this.button_Click);
this.button4.Click += new System.EventHandler(this.button_Click);

注意;这个就类似于c语言的声明。注意该处函数名要一样。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 自定义的串口发送数据的函数

private void SendDataToSerialPort(SerialPort MyPort, byte DataToSend)
{
    //将传参获取的数据放在一个byte类型的数组中,即就是放入缓冲区中,为了方便读取。
    byte[] DataToWrite = new byte[] { DataToSend };
    if (serialPort1.IsOpen)
    {
        try
        {
            //为了回去要传送的数据内容。是0x01,还是0x02,0x03...
            MyPort.Write(DataToWrite, 0, 1);
        }
        catch
        {
            MessageBox.Show("串口数据写入错误", "错误提示");
        }
    }
}

1.自定义的串口发送数据的函数。里面有两个参数:
(1)SerialPort是一个类,MyPort是一个对象,
(2)byte是一个类, DataToSend是一个对象。由于传参的DataToSend是一个byte类型,因此这块也是byte类型的。
2.Write(): 使用缓冲区的数据将指定数量的字节写入串行端口。
参数:
(1)buffer:包含要写入端口的数据的字节数组。
(2)offset:buffer 参数中从零开始的字节偏移量,从此处开始将字节复制到端口。
(3)count: 要写入的字节数。

3.3 控制哪个下位机进行发送数据

private void button_Click(object sender, EventArgs e)
{
    //获取按钮
    Button my_button = (Button)sender;
    //获取该控件的内容,存到数组中。数组一次为三个控件的内容。
    DataSended = Convert.ToByte(my_button.Tag);
    //发送数据--这里是调用了一个自定义的函数, DataSended-1是因为数组是从0开始的,因此要减1。
    SendDataToSerialPort(serialPort1, DataToSend[DataSended - 1]);
}

将发送数据校验三个相同作用的控件封装在一个函数下面,以便之后方便调用。

4.上位机接收下位机大接收状态

这个上位机跟之前的串口控制上位机,最大的区别就是,串口控制上位机只能通过上位机发送指令来控制下位机。而数据校验的上位机不仅可以通过发送指令来控制下位机,而且下位机也要根据接收的数据校验来反馈自己的接收状态。

4.1 串口接收函数应该在串口控件事件中写

private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
    //~serialPort1.ReadByte()这个返回值为int类型,因此要强制转换,因为这块是取反校验,和下位机保持一致,因此要取反,
    //获取的下位机反馈回来的数据
    byte DataReceived = (byte)(~serialPort1.ReadByte());
    //串口没有数据
    if(DataSended == 0)
        return ;
    try
    {
        if (DataToSend[DataSended - 1] == DataReceived)
        {
            MessageBox.Show("数据校验成功", "提示");
        }
        else
        {
            MessageBox.Show("数据校验失败", "错误");
        }
    }
    catch (Exception)
    {              
        throw;
    }
}

5.定时器事件
5.1 发送数据定时器开始

private void SendDataToSerialPort(SerialPort MyPort, byte DataToSend)
{
    //将传参获取的数据放在一个byte类型的数组中,即就是放入缓冲区中,为了方便读取。
    byte[] DataToWrite = new byte[] { DataToSend };
    if (serialPort1.IsOpen)
    {
        try
        {
            MyPort.Write(DataToWrite, 0, 1);

            //定时器初值为3s
            timer1.Interval = 3 * 1000;
            timer1.Start();

        }
        catch
        {
            MessageBox.Show("串口数据写入错误", "错误提示");
        }
    }
}

在这里插入图片描述
5.2 接收数据定时器停止

 private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
   //~serialPort1.ReadByte()这个返回值为int类型,因此要强制转换,因为这块是取反校验,和下位机保持一致,因此要取反,
   //获取的下位机反馈回来的数据
   byte DataReceived = (byte)(~serialPort1.ReadByte());
   try
   {
       timer1.Stop();
   }
   catch (Exception)
   {     
       throw;
   }
   //串口没有数据
   if(DataSended == 0)
       return ;
   try
   {
       if (DataToSend[DataSended - 1] == DataReceived)
       {
           MessageBox.Show("数据校验成功", "提示");
       }
       else
       {
           MessageBox.Show("数据校验失败", "错误");
       }
   }
   catch (Exception)
   {              
       throw;
   }
}

在这里插入图片描述
5.3 定时器事件,定时3s后,还是没有反应,那就认为下位机数据校验超时,反馈失败。

private void timer1_Tick(object sender, EventArgs e)
{
    string my_str = "第" + DataSended.ToString() + "路校验超时";
    //校验超时后定时器停止
    timer1.Stop();
    MessageBox.Show("校验超时", "错误提示");
}

在这里插入图片描述
6.定时器虽然能反馈下位机的接收状态,但是还是不够明显。下来我们使用visual basic power控件来展示下位机的接收状态,和上位机的发送状态。

 //由于三个ovalShape控件的作用是一样的,因此封装在一个函数中。
private void ovalShape_Click(int which)
{
    switch (which)
    {
        case 0x01:
            ovalShape1.FillColor = Color.Green;
            break;
        case 0x02:
            ovalShape2.FillColor = Color.Green;
            break;
        case 0x03:
            ovalShape3.FillColor = Color.Green;
            break;
        case 0x11:
            ovalShape1.FillColor = Color.Red;
            break;
        case 0x12:
            ovalShape2.FillColor = Color.Red;
            break;
        case 0x13:
            ovalShape3.FillColor = Color.Red;
            break;               
        case 0x04:
            ovalShape1.FillColor = Color.Green;
            ovalShape2.FillColor = Color.Green;
            ovalShape3.FillColor = Color.Green;
            break;
        case 0x14:
            ovalShape1.FillColor = Color.Red;
            ovalShape2.FillColor = Color.Red;
            ovalShape3.FillColor = Color.Red;
            break;
        default:
            break;
    }
}
private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
    //~serialPort1.ReadByte()这个返回值为int类型,因此要强制转换,因为这块是取反校验,和下位机保持一致,因此要取反,
    //获取的下位机反馈回来的数据
    byte DataReceived = (byte)(~serialPort1.ReadByte());
    try
    {
        timer1.Stop();
    }
    catch (Exception)
    {     
        throw;
    }

    //看接收到的数据是什么,来据欸的那个每一路的状态。
    ovalShape_Click(DataReceived);


    //串口没有数据
    if(DataSended == 0)
        return ;
    try
    {
        if (DataToSend[DataSended - 1] == DataReceived)
        {
            MessageBox.Show("数据校验成功", "提示");
        }
        else
        {
            MessageBox.Show("数据校验失败", "错误");
        }
    }
    catch (Exception)
    {              
        throw;
    }
}

在这里插入图片描述

由于没有下位机,没有硬件设备,所以没有办法验证。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:45:14  更:2022-03-24 00:45:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:24:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码