当前位置:首页 > 行业动态 > 正文

c#串口通信收发数据

csharp,using System;,using System.IO.Ports;,using System.Text;class Program,{, static void Main(), {, // 配置串口参数, SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);, serialPort.Open(); // 发送数据, string sendData = "Hello";, serialPort.Write(sendData.ToCharArray(), 0, sendData.Length); // 接收数据, byte[] buffer = new byte[serialPort.BytesToRead];, int bytesRead = serialPort.Read(buffer, 0, buffer.Length);, string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("Received: " + receivedData); serialPort.Close();, },},

在C#中进行串口通信的收发数据操作,主要涉及到System.IO.Ports命名空间下的SerialPort类,以下是关于如何使用该类进行串口通信收发数据的详细步骤和示例代码:

一、引入必要的命名空间

需要在代码文件的顶部引入System.IO.Ports命名空间,以便使用SerialPort类。

using System;
using System.IO.Ports;
using System.Text;

二、创建并配置SerialPort对象

1、创建SerialPort实例:通过new关键字创建一个SerialPort类的实例。

2、设置串口参数:配置串口的基本参数,如端口名(PortName)、波特率(BaudRate)、数据位(DataBits)、停止位(StopBits)和校验位(Parity)。

示例代码如下:

SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM3"; // 根据实际情况修改端口名
serialPort.BaudRate = 9600;   // 设置波特率
serialPort.DataBits = 8;      // 数据位
serialPort.StopBits = StopBits.One; // 停止位
serialPort.Parity = Parity.None;  // 无校验位

三、打开串口连接

在配置好串口参数后,需要调用Open方法来打开串口连接。

if (!serialPort.IsOpen)
{
    try
    {
        serialPort.Open();
        Console.WriteLine("串口已成功打开");
    }
    catch (Exception ex)
    {
        Console.WriteLine("打开串口时发生错误: " + ex.Message);
    }
}

四、发送数据

使用Write方法或WriteLine方法向串口发送数据。Write方法用于发送原始字节数组,而WriteLine方法则用于发送字符串,并在字符串末尾添加换行符。

string dataToSend = "Hello, Serial Port!";
byte[] dataBytes = Encoding.UTF8.GetBytes(dataToSend);
serialPort.Write(dataBytes, 0, dataBytes.Length);
// 或者使用WriteLine方法
// serialPort.WriteLine(dataToSend);

五、接收数据

接收数据通常有两种方式:同步读取和异步读取。

1、同步读取:使用Read方法或ReadLine方法从串口读取数据,这些方法会阻塞当前线程,直到读取到指定数量的数据或遇到换行符(对于ReadLine方法)。

示例代码如下:

int bytesRead = 0;
byte[] buffer = new byte[1024];
bytesRead = serialPort.Read(buffer, 0, buffer.Length);
string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine("收到的数据: " + receivedData);

或者使用ReadLine方法:

string receivedData = serialPort.ReadLine();
Console.WriteLine("收到的数据: " + receivedData);

2、异步读取:通过订阅SerialPort类的DataReceived事件来实现异步读取,当串口接收到数据时,会自动触发该事件,并在事件处理程序中读取数据。

示例代码如下:

serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Console.WriteLine("收到的数据: " + indata);
}

六、关闭串口连接

在完成数据传输后,应调用Close方法关闭串口连接,以释放系统资源。

if (serialPort.IsOpen)
{
    serialPort.Close();
    Console.WriteLine("串口已成功关闭");
}

七、完整示例代码

以下是一个包含上述所有步骤的完整示例代码:

using System;
using System.IO.Ports;
using System.Text;
class Program
{
    static void Main()
    {
        SerialPort serialPort = new SerialPort();
        serialPort.PortName = "COM3"; // 根据实际情况修改端口名
        serialPort.BaudRate = 9600;   // 设置波特率
        serialPort.DataBits = 8;      // 数据位
        serialPort.StopBits = StopBits.One; // 停止位
        serialPort.Parity = Parity.None;  // 无校验位
        if (!serialPort.IsOpen)
        {
            try
            {
                serialPort.Open();
                Console.WriteLine("串口已成功打开");
            }
            catch (Exception ex)
            {
                Console.WriteLine("打开串口时发生错误: " + ex.Message);
                return;
            }
        }
        string dataToSend = "Hello, Serial Port!";
        byte[] dataBytes = Encoding.UTF8.GetBytes(dataToSend);
        serialPort.Write(dataBytes, 0, dataBytes.Length);
        // 或者使用WriteLine方法
        // serialPort.WriteLine(dataToSend);
        // 同步读取数据
        int bytesRead = 0;
        byte[] buffer = new byte[1024];
        bytesRead = serialPort.Read(buffer, 0, buffer.Length);
        string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine("收到的数据: " + receivedData);
        // 或者使用ReadLine方法
        // string receivedData = serialPort.ReadLine();
        // Console.WriteLine("收到的数据: " + receivedData);
        // 异步读取数据(可选)
        // serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        // private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        // {
        //     SerialPort sp = (SerialPort)sender;
        //     string indata = sp.ReadExisting();
        //     Console.WriteLine("收到的数据: " + indata);
        // }
        if (serialPort.IsOpen)
        {
            serialPort.Close();
            Console.WriteLine("串口已成功关闭");
        }
    }
}

八、相关问答FAQs

问:如何确定串口是否已经成功打开?

答:可以通过检查SerialPort对象的IsOpen属性来确定串口是否已经成功打开,如果IsOpen属性为true,则表示串口已经成功打开;否则,表示串口未打开或打开失败,在尝试打开串口时,还可以捕获可能抛出的异常,并根据异常信息来判断打开串口是否失败。

问:如何设置串口的超时时间?

答:可以通过设置SerialPort对象的ReadTimeoutWriteTimeout属性来设置串口的读/写超时时间,这两个属性都以毫秒为单位,表示在指定的超时时间内没有完成读/写操作时,将引发一个TimeoutException异常,将读超时时间设置为5000毫秒(即5秒),可以这样设置:serialPort.ReadTimeout = 5000;,同样地,可以将写超时时间设置为3000毫秒(即3秒):serialPort.WriteTimeout = 3000;

九、注意事项

确保串口设备已正确连接到计算机,并且端口号与代码中设置的端口号相匹配。

根据实际需求选择合适的波特率、数据位、停止位和校验位等串口参数,不同的串口设备可能有不同的参数要求。

在进行串口通信时,应注意线程安全和异常处理,特别是在多线程环境下访问串口时,应避免并发访问导致的问题。

0