System.IO.Ports.SerialPort在8KB后停止发送

时间:2013-12-16 12:37:18

标签: c# serial-port

我有这个代码,它通过串口发送数据,带有一个带有数据长度的简单头。

public void WriteToPort(string message)
{
    byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);
    int length = messageBytes.Length;

    byte b0 = (byte)((length >> 24) & 0xFF);
    byte b1 = (byte)((length >> 16) & 0xFF);
    byte b2 = (byte)((length >> 8) & 0xFF);
    byte b3 = (byte)((length >> 0) & 0xFF);

    List<byte> bytes = new List<byte>() { b0, b1, b2, b3};
    bytes.AddRange(messageBytes);

    if (serialPort != null && !serialPort.IsOpen)
    {
        serialPort.Open();
    }

    serialPort.Write(bytes.ToArray(), 0, bytes.Count);
}

我使用此代码将数据从桌面应用程序发送到连接到串行端口的设备。

此代码运行正常,将数据发送到我的设备而没有任何问题。当我们在设备上集成一些其他应用程序时,问题就开始了,这使得它显着变慢。这是预期的,它根本不会影响沟通。

之后,我的桌面应用程序似乎发送了所有数据,但设备只收到8KB的数据。我们尝试使用RealTerm发送相同的数据并且它有效,所以问题可能出在这段代码上。

你知道为什么会这样吗?

编辑:抱歉,我忘了提到我已经尝试过以小块发送数据但它没有用。

1 个答案:

答案 0 :(得分:0)

试试这个:

    public void WriteToPort(string message)
    {
        // Throw exception if serialPort is not initialised.
        // Old code would have thrown from serialPort.Write
        if (serialPort == null) throw new InvalidOperationException();

        // Convert message to bytes
        byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);
        // Convert message length to bytes
        byte[] lengthBytes = BitConverter.GetBytes(messageBytes.Length);

        // Convert message length bytes to big endian if needed
        if (BitConverter.IsLittleEndian) Array.Reverse(lengthBytes);

        // Open serial port if needed
        if (!serialPort.IsOpen) serialPort.Open();

        // Write length
        serialPort.Write(lengthBytes, 0, lengthBytes.Length);
        // Write message
        serialPort.Write(messageBytes, 0, messageBytes.Length);
    }

还有要检查的事项:

  • 您确定设备需要 BIG ENDIAN 编码的 INT 前缀,其中字节数不包括长度本身?< / LI>
  • 您确定您的串口配置了正确的流量控制和握手选项吗?
  • 您确定该设备的UTF8编码是否正确?