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

前言:C#串口通信

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

1、什么是串口通信

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

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

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

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

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

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

串行按位(bit)发送和接收字节,尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。
串口通信示意图这里提一句,我们笔记本的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

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的 C# 串口通信数据接收并将数据插入数据库的示例代码: ```csharp using System; using System.IO.Ports; using System.Data.SqlClient; class SerialPortReader { static void Main() { // 创建一个串口对象 SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); // 打开串口 serialPort.Open(); // 创建一个 SQL 连接对象 SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=dbName;Integrated Security=True"); // 创建一个 SQL 命令对象 SqlCommand cmd = new SqlCommand(); // 设置 SQL 命令对象的连接 cmd.Connection = conn; // 设置 SQL 命令对象的 SQL 语句 cmd.CommandText = "INSERT INTO tableName (data) VALUES (@data)"; // 创建一个 SQL 参数对象 SqlParameter dataParam = new SqlParameter("@data", System.Data.SqlDbType.NVarChar); // 将 SQL 参数对象添加到 SQL 命令对象的参数集合中 cmd.Parameters.Add(dataParam); // 创建一个缓冲 byte[] buffer = new byte[1024]; // 不断循环,读取串口数据 while (true) { // 读取串口数据到缓冲 int bytesRead = serialPort.Read(buffer, 0, buffer.Length); // 将缓冲数据转换为字符串 string data = System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead); // 设置 SQL 参数对象的值 dataParam.Value = data; // 打开 SQL 连接 conn.Open(); // 执行 SQL 命令对象,将数据插入数据库 cmd.ExecuteNonQuery(); // 关闭 SQL 连接 conn.Close(); } } } ``` 注意,以上代码仅作为示例,实际应用中还需要进行错误处理、数据验证等操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值