alb技术笔记基于多线程方式的串行通信接口数据接收案例

一只爱蜜蜂的小学习 一只爱蜜蜂的小学习     2022-09-07     676

关键词:

基于多线程方式的串行通信接口数据接收案例

广东职业技术技术学院  欧浩源

1、案例背景

        在本博客的《【CC2530入门教程-06】CC2530的ADC工作原理与应用》中实现了电压数据采集的程序设计,传感器模块以每1秒发送一帧数据的形式通过串口向上位机发送电压数据。其数据帧由4个字节组成:一个帧头和一个帧尾,中间两个字节为电压数据,其格式如下:

        帧头(0xAF)    电压数据高8位    电压数据低8位    帧尾(0xFA)

        在篇博文中,将讲述如何通过多线程的方式,从串口接收传感器发送过来的数据帧,并将数据帧和换算后的实际电压值显示出来。

2、界面设计

3、引入命令空间

        使用多线程的方式,需要引入命名空间:System.Threading;

        使用串行通信接口,需要引入命名空间:System.IO.Ports

4、初始化工作

        首先,定义一个串行接口的对象和一个线程的字段,

        然后,给主窗体添加窗体装载事件(即Load事件),在该事件中对各个控件的属性进行初始化工作。

        SerialPort com = new SerialPort();                  //实例化一个串口对象
        Thread t;                                           //定义一个线程字段
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.ReadOnly = true;                       //文本框只读
            textBox1.ScrollBars = ScrollBars.Vertical;      //文本框支持垂直滚动条
            comboBox1.Items.Add("COM1");
            comboBox1.Items.Add("COM2");
            comboBox1.Items.Add("COM3");
            comboBox1.Items.Add("COM4");
            comboBox1.Items.Add("COM5");
            comboBox1.SelectedIndex = 2;

            comboBox2.Items.Add("4800");
            comboBox2.Items.Add("9600");
            comboBox2.Items.Add("19200");
            comboBox2.Items.Add("57600");
            comboBox2.Items.Add("115200");
            comboBox2.SelectedIndex = 1;

            comboBox3.Items.Add("6");
            comboBox3.Items.Add("7");
            comboBox3.Items.Add("8");
            comboBox3.SelectedIndex = 2;

            comboBox4.Items.Add("1");
            comboBox4.Items.Add("1.5");
            comboBox4.Items.Add("2");
            comboBox4.SelectedIndex = 0;
        }

5、设置串行接口

        在进行串口通信的时候,一般的流程是:先设置通信的端口号波特率数据位停止位校验位,然后打开串口,接着发送数据和接收数据,最后要关闭串口

        在本案例中,对串口的各个参数配置完成后,打开串口,然后启动串口数据接收的线程,开始以轮询的方式接收数据。

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "打开串口")
            {
                com.PortName = comboBox1.Text;                      //选择串口号
                com.BaudRate = int.Parse(comboBox2.Text);           //选择波特率
                com.DataBits = int.Parse(comboBox3.Text);           //选择数据位数
                com.StopBits = (StopBits)int.Parse(comboBox4.Text); //选择停止位数
                com.Parity = Parity.None;                           //选择是否奇偶校验

                try
                {
                    if (com.IsOpen)                                 //判断该串口是否已打开
                    {
                        com.Close();
                        com.Open();
                    }
                    else
                    {
                        com.Open();
                    }
                    t = new Thread(com_DataReceived);        //创建并启用数据接收线程
                    t.Start();
                }
                catch(Exception ex)
                {
                    MessageBox.ReferenceEquals("错误:" + ex.Message, "串口通信");
                }
                button1.Text = "关闭串口";
            }
            else if (button1.Text == "关闭串口")
            {
                com.Close();                        //关闭串口
                t.Abort();                          //终止线程
                button1.Text = "打开串口";
            }
        }

6、串口数据接收线程方法

         在该方法中,只有在串口打开并连接成功的情况下在去读取串口缓冲区中的数据。

        首先通过读取BytesToRead属性,获取串口接收缓冲区中的数据字节数,然后根据这个属性实例化一个byte类型的数据,在通过Read方法将数据从缓冲区中读取到数组中。

        将数据帧以十六进制的形式显示到窗体的文本框中。

        通过计算获得实际的电压值,显示到对应的Lable标签中。

        private void com_DataReceived()
        {
            while (com.IsOpen)                                          //在串口已打开情况下读取数据
            {
                string strRcv = "";
                int count = com.BytesToRead;                            //获取串口缓冲器的字节数
                byte[] readBuffer = new byte[count];                    //实例化接收串口数据的数组
                if (count != 0)                                         //如果串口接收到数据
                {
                    strRcv = count.ToString() + " ";      
                    com.Read(readBuffer, 0, count);                     //从串口缓冲区读出数据到数组
                    for (int i = 0; i < readBuffer.Length; i++)         
                    {
                        strRcv += readBuffer[i].ToString("X2") + " ";   //16进制显示  
                    }
                    textBox1.Text += strRcv + "\r\n";

                    if (readBuffer[0] == 0xAF && readBuffer[3] == 0xFA) //判断数据的帧头和帧尾
                    {
                        Int32 ad = readBuffer[1];
                        double advalue;
                        ad <<= 8;
                        ad |= readBuffer[2];                            //从数据帧中将电压数据取出
                        advalue = ad;
                        advalue = (advalue * 3.3) / 32768;              //将数据换算为实际的电压值
                        label6.Text = advalue.ToString("F2") + " V";
                    }
                }
                Thread.Sleep(500);
            }

7、程序运行结果

8、结语

        串行接口通信是物联网技术应用中常用的数据交互方式。

        利用多线程的手段以轮询的方式读取串口缓冲区的数据是一种最基础的方法,然而并不是唯一的方法。采用DadaReceived事件触发的方法来接收数据也很常用,当程序设计程度稍微复杂一点,后面再慢慢讲述。

arduino——串口通讯(笔记)

参考技术AArduino与外部设备通信的方式均属于串行通讯。串行通讯的概念是相对于并行通信而言的。(当然目前来说只是概念上的认知。)arduino硬件集成了串口、IIC、SPI三种常见的的通信方式,掌握了这三种通讯类库的方法,即... 查看详情

stc51从入门到精通(汇编)~~~第八讲:串行通信技术

目录​​8.180C51单片机串行通信技术的特点​​​​8.2串行通信基本知识​​​​8.2.1数据通信​​​​8.2.2串行通信的传输方式​​​​8.2.3异步通信和同步通信​​​​8.3串行接口的组成和特性​​​​8.3.1串行口的结构​​... 查看详情

cc2530入门教程-05cc2530的串行接口原理与应用

第5课 CC2530的串行接口原理与应用广东职业技术学院 欧浩源一、并行通信与串行通信    微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。  &n... 查看详情

串行输入输出和并行输入输出的区别解析

...过程。以上内容参考:百度百科-串行输入输出接口参考技术A1、计算机与外部信息交换方式有两种,一种是并行通信,另一种是串行通信。并行通信时,数据各位同时传送。而串行通信时,数据和控制信息是一位接位串行地传送... 查看详情

学习认识串行接口

...接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (SerialInterface)是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输... 查看详情

九中级篇串行接口(usart)(代码片段)

...)串行的通信指的是数据一位一位的按顺序进行传输操作方式简单,只需要一条数据线就可以完成数据的传输2.串口的工作模式单工模式:A------>-----B,A设备只发送数据,B设备只接收数据,数据线只有一种方向半双工模式... 查看详情

什么叫串行通信和并行通信?异步通信和同步通信有何区别?

...线。8080不是很了解。不过应该也是一种通信协议。参考技术A串行的传输速度慢,但是对线路的要求低一些。并行的对线路的要求高,但是速度快。例如说相对于USB来说,打印机的接口和线路就属于并行通信。他的速度快但是端... 查看详情

unity串口通信接受和发送数据c#(代码片段)

...接口(串口)通常指COM接口,是采用串行通信方式的扩展接口。串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数... 查看详情

并口线与串口线的区别在哪?

...度百科-串行接口参考资料来源:百度百科-并行接口参考技术A一、表面区别串口的插座一般是针,并口的插座为针孔。最明显的区别为电脑上的串口COM口和并口打印机口 查看详情

第14章基于qt5串口设备开发

14.1 QT下串口编程介绍14.1.1串口协议介绍串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(SerialInterface)是指数据一位一位地顺序传送,其特点是通信线路简... 查看详情

springboot接口排队(串行执行)

参考技术A在调用接口时将线程号(多实例的情况下得用uuid,线程号可能会重复)存入redis队列,查询队首线程号(uuid)如果是当前线程,则执行逻辑、出队,否则等待。后调用的接口后执行了,如果不加该注解的情况如下,执行快的... 查看详情

什么是通信协议?它主要包含哪些要素?

...规则(时序):明确通信的顺序、速率匹配和排序.参考技术A通信协议所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双... 查看详情

简述单片机串行口的工作方式

...就一批计算机应用与智能化控制的科学家、工程师。参考技术A51单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能... 查看详情

并行与串行的区别及并行通信的系统同步方式

本篇这里所指并行信号和串行信号,包括了传输(通信)方式,又有接口类型,同时还有数据本身的协议特点,信号、协议、总线和接口。想了解信号、协议、总线和接口之间的区别的,可以看前一篇文章:高速串行简史(一)... 查看详情

串口通信基础,接收,发送数据(代码片段)

通信接口背景知识设备之间通信的方式一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是:串行通信的分类1、按照数据传送方向,分为:   单工:数据传输只支持数据在一个方向上... 查看详情

三菱plc有几种通讯方式

...,请好心人帮下忙,谢谢!三菱PLC通讯方式应用在目前的技术领域的有并行通信、单工通信,一般不会同时应用在同一个地区的通信中,并行通信、并行通信和并行通信的具体介绍如下:1、串行通信串行通信作为计算机通信方... 查看详情

【山外笔记-计算机网络·第7版】第02章:物理层

参考技术A[学习笔记]第02章_物理层-打印版.pdf本章最重要的内容是:(1)物理层的任务。(2)几种常用的信道复用技术。(3)几种常用的宽带接入技术,主要是ADSL和FTTx。1、物理层简介(1)物理层在连接各种计算机的传输媒体... 查看详情

关于数据通信和串口(usart)的一些笔记

...信的实验里,我们简单介绍了一小部分串口和通信的笔记;并且在上一篇笔记里,我们介绍了三个比较常见和重要的通信协议SPI,I2C和CAN总线通信。今天我们来更深地了解数据通信和串口。首先我们介绍一些数据通信... 查看详情