`
liuzhaohong
  • 浏览: 12492 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

串口接收数据实例

阅读更多
今天我的串口接收数据的项目终于做完了,拿出来共享一下~~

using System.IO.Ports;
using System.Threading;
using System.IO;

namespace SerialPortDemo
{
    public partial class Form1 : Form
    {
        bool isStar = false;
        Thread threadReceive = null;
        SerialPort serialPort = null;
        int i = 0;
        int k = 0;

        public Form1()
        {
            InitializeComponent();
            this.comboBox1.SelectedIndex = 0;
            this.comboBox2.SelectedIndex = 2;

            serialPort = new SerialPort();
            if (serialPort.IsOpen)
                serialPort.Close();
            //获得参数
            serialPort.PortName = comboBox1.SelectedItem.ToString();
            serialPort.BaudRate = int.Parse(comboBox2.SelectedItem.ToString());
            serialPort.Open();

            ThreadStart method = new ThreadStart(ReceiveData);//在线程上执行此方法
            threadReceive = new Thread(new ThreadStart(method));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (button1.Text == "接收数据")
                {
                    if (!isStar)//如果isStar等于true,则启动线程
                    {
                        threadReceive.Start();
                        this.toolStripStatusLabel1.Text = "正在接收数据......";
                    }
                    else
                    {
                        threadReceive.Resume();//如果isStar等于false,则解除挂起线程
                        this.toolStripStatusLabel1.Text = "暂停接收...";
                    }
                    button1.Text = "停止接收";
                }
                else
                {

                    threadReceive.Suspend();//如果是"停止接收",则挂起线程
                    button1.Text = "接收数据";
                    this.toolStripStatusLabel1.Text = "暂停接收...";
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                serialPort.Close();

            }

        }
        //不断循环接收数据
        private void ReceiveData()
        {
            while (true)
            {
                Thread.Sleep(500);
                this.isStar = true;
                this.SynReceiveData();
            }
        }

        //通过串口取数据
        private void SynReceiveData()
        {
            MessageBox.Show("接收数据" + k);
            k++;
            string inputData = serialPort.ReadExisting();
            try
            {
                if (inputData != string.Empty)
                {
                    if (inputData.Trim().Length == 45)
                    {
                        SetText(inputData);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        //分隔字符串并保存在指定目录下
        private void SetText(string str)
        {
            string aa = str;
            StreamWriter sw = null;

            if (aa != string.Empty)
            {
                string aaa = aa.Insert(13, ",");
                aaa = aaa.Insert(32, ",");

                String fileName = "C:\\GAJ_PUB\\kaoqin";
                if (Directory.Exists(fileName) == false)//如果目录不存在
                {
                    Directory.CreateDirectory(fileName);//创建目录
                    sw = File.CreateText("C:\\GAJ_PUB\\kaoqin\\person" + i + ".txt");//创建文本
                }
                else
                {
                    sw = File.CreateText("C:\\GAJ_PUB\\kaoqin\\person" + i + ".txt");
                }
                sw.WriteLine(aaa);

                sw.Flush();

                sw.Close();
                i++;
                MessageBox.Show("文件已存入指定目录下!!");
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (threadReceive.ThreadState==ThreadState.Running)//当前状态为启动线程
            {
                threadReceive.Abort();
                this.Close();
            }
            else if (threadReceive.ThreadState == ThreadState.Suspended)//当前状态为挂起线程
            {
                threadReceive.Resume();
                threadReceive.Abort();
                this.Close();
            }
            else if (threadReceive.ThreadState == ThreadState.SuspendRequested)//当前状态为正在挂起线程
            {
                threadReceive.Resume();
                threadReceive.Abort();
                this.Close();
            }
            else if (threadReceive.ThreadState == ThreadState.Unstarted)
            {
                this.Close();
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (threadReceive.ThreadState == ThreadState.Running)//当前状态为启动线程
            {
                threadReceive.Abort();
                this.Close();
            }
            else if (threadReceive.ThreadState == ThreadState.Suspended)//当前状态为挂起线程
            {
                threadReceive.Resume();
                threadReceive.Abort();
                this.Close();
            }
            else if (threadReceive.ThreadState == ThreadState.SuspendRequested)//当前状态为正在挂起线程
            {
                threadReceive.Resume();
                threadReceive.Abort();
                this.Close();
            }
        }

      
    }
}
分享到:
评论

相关推荐

    MCGS串口收发数据.rar

    在MCGS中,通常使用事件驱动的方式,当串口接收到数据或发送数据成功时,会触发相应的事件,从而进行数据处理。 "教程"部分将详细解释串口通信的原理和MCGS中实现串口通信的步骤。这部分内容可能包括如何建立串口...

    Mcgs_串口数据收发.zip

    3. **编写收发程序**:利用MCGS提供的串口API函数,编写串口数据的发送和接收程序。对于自由口协议,我们需要自定义发送数据的结构和解析接收数据的逻辑。 4. **数据传输**:通过调用MCGS的“发送”函数,将待发送...

    MCGS昆仑通态串口数据收发驱动 串口收发数据在MCGS昆仑通态的嵌

    《MCGS昆仑通态串口数据收发驱动详解及应用》 MCGS(Multipurpose Control and Graphics System)昆仑通态是一款广泛应用于工业自动化领域的组态软件,它提供了丰富的功能,包括人机界面设计、数据采集与控制、报警...

    MCGS触摸屏使用串口收发原始数据的例子

    MCGS触摸屏使用串口收发原始数据的例子,用TPC7062TI测试过可以用,这个用途很多,比如可用于和扫码器通讯。

    STM32串口收发数据

    STM32串口收发数据是嵌入式开发中的常见任务,主要涉及到STM32微控制器的通用同步/异步收发传输器(USART)功能。在这个过程中,我们需要配置USART来实现与个人计算机(PC)之间的通信。下面将详细介绍STM32如何设置...

    qt下串口接收数据线程实现

    在Qt框架下,实现串口接收数据的线程化处理是一项关键任务,特别是在处理高速串口数据流时。Qt提供了一套完整的QSerialPort模块,用于串口通信,而使用线程可以确保串口接收不影响主线程的性能,提供更流畅的用户...

    串口通信简单实例源代码详解

    4. 串口接收函数:串口接收函数用于处理串口接收中断,包括接收包括起始位'S'在内的十位数据到数据缓冲区。 5. 计算校验位函数:计算校验位函数用于计算校验和,确保数据传输的正确性。 6. 串口通信的优点:串口...

    易语言串口通信协议实例

    接收数据时,我们需要监听串口的事件,如数据到达事件,当有新数据到达时,通过读取函数获取数据并进行处理。在工控或仪表通信中,这些数据可能是特定的指令或反馈信息。 "科泽氯离子通信模拟.exe"可能是一个执行...

    c#串口收发数据代码.doc

    本文将详细介绍一个基于C#实现的简单串口收发数据实例,并深入探讨其内部原理和技术要点。 #### 二、串口通信基础知识回顾 在深入了解本实例之前,我们首先回顾一下串口通信的基本概念: 1. **串行通信**:数据按...

    C#串口通信数据接收不完整解决方案实例

    基于Modbus RTU协议,实例展示了串口通信数据接收不完整解决方案

    C#中串口接收数据并生成Excel和数据图片.zip_excel_excel 串口_excel串口_串口采集_采集

    9. **数据解析与格式化**:串口接收到的数据可能是原始的字节流或字符串,需要根据协议或约定进行解析,转换为有意义的数据结构。C#的字符串处理和正则表达式等工具能帮助你完成这个任务。 10. **可视化界面设计**...

    MCGS昆仑通态串口数据收发驱动

    - **数据收发**:通过MCGS的脚本语言或者事件驱动机制,编写收发数据的程序,实现数据的读取和发送。 - **错误处理**:在编写程序时,需要考虑串口通信可能遇到的错误,如超时、数据校验错误等,进行适当的异常...

    串口收发数据简单实例

    基于VS2012MFC类库开发的简单串口通信实例,实现电脑与单片机之间的数据收发,可以作为学习之用,后期会有更新版本,这个仅为测试用

    MFC串口RS232编程简单实例(数据发送与接收)

    你可以重载`OnReceive`和`OnTransmit`成员函数,当串口接收到数据或发送数据时,这些函数会被自动调用。 在MFC串口RS232编程实例中,通常会有一个主窗口,包含一些控件如按钮、文本框等,用户可以通过点击按钮来...

    C#上位机串口接收数据并绘图

    我们可以创建一个时间序列数据结构,用于存储从串口接收到的数据点。 绘图部分涉及数据可视化,这是数据分析和监控的关键环节。在C#中,我们可以通过Chart控件的API动态更新数据。每当接收到新的数据点时,我们可以...

    C# 串口收发测试 软件创建串口组件,实现独立线程接收和数据处理。

    这样,即使串口接收数据时,主程序仍能继续运行。 4. **数据发送**: 发送数据到串口通过`Write`方法实现,可以是字符串或字节数组: ```csharp serialPort.Write("Hello, World!"); ``` 5. **异常处理与关闭...

    unity收发串口数据

    在Unity中,我们有时需要与外部设备进行通信,例如通过串口(Serial Port)来收发数据,这在游戏控制台、虚拟现实应用或者物联网项目中尤为常见。在.NET框架下,Unity提供了丰富的API支持,让我们可以方便地实现串口...

    串口通信实例源代码C#

    3. **事件处理**:`SerialPort`类提供了丰富的事件,如`DataReceived`事件,当串口接收到数据时触发。我们通常会在此事件的事件处理函数中处理接收到的数据。例如: ```csharp port.DataReceived += new ...

    C#源码(串口传送数据实例)

    总的来说,"C#源码(串口传送数据实例)"是一个实用的学习资源,它将帮助初学者掌握C#编程环境下串口通信的实践技巧。通过理解和分析这个实例,你可以更好地理解串口通信的工作原理,以及如何将其应用于实际项目中。...

Global site tag (gtag.js) - Google Analytics