湖中仙人 2025-02-14 16:57 采纳率: 11.8%
浏览 27

用串口通信读取电表数据

我用串口进行电表数据的读取,看到电表上明明有数据;但是我确读取不到;那位能帮忙看下


```c#
        string str_com = string.Empty;
        string str_baudrate = string.Empty;
        int I_timeout = 1000;
        SerialPort mySerialPort;
        static string str_readmes = string.Empty;

        private void Form1_Load(object sender, EventArgs e)
        {
            str_com = this.textBox_com.Text.Trim();
            str_baudrate = this.textBox_baudrate.Text.Trim();
            I_timeout =Convert.ToInt16(this.textBox_jsys.Text.Trim());

            mySerialPort = new SerialPort("COM" + str_com)   //示例化COM口
            {
                BaudRate = Convert.ToInt32(str_baudrate),   //设置波特率
                Parity = Parity.None,   //设置校验位
                DataBits = 8,    //设置数据位
                StopBits = StopBits.One,   //设置停止位
                Handshake = Handshake.None,   //设置握手协议
                ReadTimeout = I_timeout,    //设置读延时
                WriteTimeout=I_timeout     //设置写延时
            };
        }

        private void button_readadd_Click(object sender, EventArgs e)
        {
            try
            {
                //方法1:使用ReadLine()方法(适用于有换行符的情况)
                string data = mySerialPort.ReadLine();
                Console.WriteLine(data);

                //方法2:使用ReadExisting()方法(读取缓冲区中的所有数据)
                string data2 = mySerialPort.ReadExisting();
                Console.WriteLine(data2);

                //方法3:使用Read()方法(以字节数组形式读取数据)
                byte[] buffer = new byte[mySerialPort.BytesToRead]; // 创建一个足够大的缓冲区来存储数据
                int bytesRead = mySerialPort.Read(buffer, 0, buffer.Length); // 读取数据到缓冲区
                string data3 = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead); // 将字节转换为字符串
                Console.WriteLine(data3);

                // 命令格式
                string readCommand = "FE 68 17 00 43 45 AA AA AA AA AA AA A0 51 EA 05 01 00 40 01 02 00 00 ED 03 16";
                mySerialPort.WriteLine(readCommand); // 发送命令
                string response = mySerialPort.ReadExisting();
                Console.WriteLine("Received: " + response); // 输出响应数据
            }
            catch (TimeoutException) { } // 处理超时异常(如果需要)
            finally { mySerialPort.Close(); } // 确保关闭串口
        }


  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-02-14 16:57
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你使用 C# 通过串口读取电表数据,但是却无法读取到数据。下面是一些可能的解决方案:

    1. 串口配置:确保串口的波特率、数据位、停止位和 parity 都正确地设置了。可以使用串口调试工具来检查串口的配置。
    2. 串口读取方式:使用 SerialPort.ReadLine() 方法读取串口数据,这个方法会读取一行数据直到遇到换行符(LF 或 CR)。如果电表数据不包含换行符,可以使用 SerialPort.Read() 方法读取固定长度的数据。
    3. 串口数据校验:电表数据可能包含校验和,可以使用 CRCChecksum 来验证数据的正确性。
    4. 串口 BufferSize:确保串口的 BufferSize 设置足够大,以免数据被截断。

    以下是一个简单的示例代码,使用 SerialPort.Read() 方法读取串口数据:

    using System;
    using System.IO.Ports;
    
    class SerialPortExample
    {
        static void Main(string[] args)
        {
            SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            serialPort.Open();
    
            byte[] buffer = new byte[1024];
            int bytesRead = serialPort.Read(buffer, 0, buffer.Length);
    
            // 处理读取的数据
            string str_com = Encoding.ASCII.GetString(buffer, 0, bytesRead);
            Console.WriteLine(str_com);
        }
    }
    

    请注意,这只是一个简单的示例代码,实际情况中可能需要根据电表的具体协议和数据格式进行修改。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月14日