C#串口通信,清除缓存区数据,发送区接收区

C#清除缓存区数据,发送区接收区

  • 前言:C#串口通信
    • 1、什么是串口通信
    • 2、C#中封装的serialPort
    • 3、C#串口通信数据缓冲区的清除

前言:C#串口通信

今天这篇文章带大家学习下C#中的串口通讯。在日常的开发工作中,如果工作内容是CS方向的同学应该很容易接触到串口通讯方面的业务需求。那么也就很容易想到C#中SerialPort类,它就是专门来处理串口通讯相关的。

1、什么是串口通信

串口通讯是指外设和计算机间通过数据信号线,地线,控制线等,按位进行传输数据的一种通讯方式。

这种通讯方式使用的数据线少,在远距离通信中可以节约成本,但其传输速度比并行通讯慢。

串口是计算机上一种非常通用的设备通讯协议。大多数计算机包含两个基于RS-232的串口。

串口也是仪器仪表设备通用的通讯协议,很多GPIB兼容的设备也带有RS-232口,同时串口通信协议也可以用于获取远程设备采集的数据。

串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时也可将接受的串行数据流转换为并行的数据字符供给CPU的器件。

一般完成这种功能的电路,我们称为串行接口电路。

串行按位(bit)发送和接收字节,尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。
C#串口通信,清除缓存区数据,发送区接收区_第1张图片这里提一句,我们笔记本的USB口,它不是串口,它是所谓的U口,我们的串口如果需要插入到USB口,那么就需要一个RS-232转U口的转换器才可以。

这里需要注意下,一般我们的硬件工程师都会在自己的硬件设备都内置这个小转换设备,很方便。

2、C#中封装的serialPort

从.NET Framework 2.0开始,微软就默认提供了System.IO.Ports.SerialPort类,根据SerialPort类提供的简单操作步骤,可以很容易的完成串口的信息收发程序,从特定的串口中接收到数据也可以进行数据的发送。

关于SerialPort类的应用也很容易,可以根据微软官方的介绍进行使用。

配置SerialPort的名称,端口号,波特率等。
打开/关闭串口
接收/发送数据

SerialPort mySerialPort = new SerialPort("COM2");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity=Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.Non;

mySerialPort.DataReceived += new SerialDataReceivedEvenHandler(DataReceive_Method);

mySerialPort.Open();

mySerialPort.Close();

发送数据

using System.IO.Ports;
private static void SendSampleData()
{
    SerialPort port = new SerialPort(
        "COM1", 9600, Parity.None, 8, StopBits.One);
    port.Open();
    port.Write("Hello World");
    port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
    port.Close();
}

namespace SerialPortExample
{
    class SerialPortProgram
    {        
        private SerialPort port = new SerialPort("COM1",
          9600, Parity.None, 8, StopBits.One);

        [STAThread]
        static void Main(string[] args)
        {            
            new SerialPortProgram();
        }

        private SerialPortProgram()
        {
            Console.WriteLine("Incoming Data:");            
            port.DataReceived += new
              SerialDataReceivedEventHandler(port_DataReceived);            
            port.Open();         
            Application.Run();
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {            
            Console.WriteLine(port.ReadExisting());
        }
    }

日常串口的使用多数情况是和线程进行的,一般都是在子线程中做这些耗时和重复的工作,在主线程或者界面只进行数据的展示处理即可。

在子线程的处理过程中需要特别处理串口的打开和关闭,要及时关闭串口的状态,防止出现无法捕获的异常错误。

3、C#串口通信数据缓冲区的清除

在实际的应用过程中需要上位机向下位机循环发送某些指令,经过长时间循环之后,会导致缓冲区填满,触发自动清除功能,但会随着时间的推移使得指令的发送越来越慢,因此最后在一次循环指令发送完之后且下位机完成响应之后对发送区进行清空,待接收区拿到相应的数据之后,再做一次接收区的缓冲清理。

(1)调用SerialPort.DiscardInBuffer 方法可以清空串行驱动程序的接收缓冲区的数据。
此方法等效于 Visual Basic 6.0 代码:MSComm1.InBufferCount = 0
(2)调用SerialPort.DiscardOutBuffer 方法可以清空串行驱动程序的发送缓冲区的数据。
此方法等效于 Visual Basic 6.0 代码:MSComm1.OutBufferCount = 0

你可能感兴趣的:(c#)