C#应用程序中的SerialPort问题

时间:2010-02-24 20:16:52

标签: c# .net serial-port

我在C#中创建了一个应用程序,它使用以下命令将11字节数据发送到串行端口:

            port = new SerialPort("COM1");
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.ReadTimeout = 1000;
            port.WriteTimeout = 1000;
            port.Open();

            byte[] buffer = new byte[11];
            buffer[0] = 0;
            buffer[1] = 0;
            buffer[2] = 0;
            buffer[3] = 3;
            buffer[4] = 2;
            buffer[5] = 4;
            buffer[6] = 1;
            buffer[7] = 20;
            buffer[8] = 50;
            buffer[9] = 0;
            buffer[10] = 120;
            port.Write(buffer, 0, 11);

然后我写了另一个应用程序来测试前一个。我想检查是否正确发送了11个字节。在这个应用程序中,我使用:

        using (SerialPort port = new SerialPort("COM1"))
        {
            // configure serial port
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.Open();

            for (; ; )
            {
                byte[] b = new byte[11];
                port.Read(b, 0, 11);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 11; ++i)
                {
                    sb.Append(b[i]);
                    sb.Append(" ");
                }
                Console.WriteLine(sb.ToString());
            }
        }

接收字节。问题是,在发送这样的内容之后:

0 0 0 3 2 4 1 20 50 0 120

我收到:

0 0 0 0 0 0 0 0 0 0 0
0 0 3 2 1 4 20 50 0 120 0

为什么会这样?我的代码中有什么错误? 谢谢

2 个答案:

答案 0 :(得分:3)

您没有检查port.Read()的结果。它返回 read 的字节数,而不是请求的字节数。然后输出循环需要使用此结果作为上限。

虽然您在发送方设置了超时,但您也需要在阅读器上使用它们。

答案 1 :(得分:1)

要检查我的电脑上串行连接上发生了什么,我使用两个工具:

  • com0com:在PC上创建两个可以相互通信的串口的仿真器。我遇到的唯一缺点是你应该为低于10的COM端口设置。

  • Free Serial Port Monitor:它会在一个com端口上嗅探并显示在该行上运行的每个字节。我遇到的唯一缺点是,它有时会出现断开连接的问题,并且只会在重新启动整个电脑后再次启动。因此,如果您使用它开始会话,请确保在关闭测试应用程序中的连接之前不要断开连接或意外关闭应用程序。