C# SerialPort Write()发送的字节数大于发送缓冲区中的字节数

C# SerialPort Write()发送的字节数大于发送缓冲区中的字节数,c#,serial-port,modbus,crc16,C#,Serial Port,Modbus,Crc16,我有一个非常奇怪的问题,我正在传送一个105字节的[]缓冲区,并且不断地在另一端接收116字节 原始数据的最后2个字节是CRC16 我用于传输的代码是,它永远循环 static SerialPort sp = null; static void Main(string[] args) { //105 bytes send buffer byte[] data = new byte[] {0xa,0x03,0x64,0x0e,0x15,0x

我有一个非常奇怪的问题,我正在传送一个105字节的[]缓冲区,并且不断地在另一端接收116字节

原始数据的最后2个字节是CRC16

我用于传输的代码是,它永远循环

    static SerialPort sp = null;
    static void Main(string[] args)
    {
         //105 bytes send buffer
        byte[] data = new byte[] {0xa,0x03,0x64,0x0e,0x15,0x00,0x01,0x00,
                                  0x01,0x00,0x06,0x00,0x23,0x00,0x5f,0x00,
                                  0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,
                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                  0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,
                                  0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                  0x00,0x00,0x00,0x25,0xb8,0x00,0x05,0xff,
                                  0x23,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,
                                  0x00,0x02,0x20,0x00,0x04,0x00,0x03,0x00,
                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                  0x01,0x00,0x00,0x00,0x01,0x00,0x1f,0x00,
                                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xae,
                                  0x1f
        };

        Console.WriteLine("Serial Port Test");
        sp = new SerialPort("COM1", 19200);
        sp.Open();
        if (sp.IsOpen)
        {
            Console.WriteLine("Begining to transmit serial data..");
        }
        for (; ; )
        {
            Thread.Sleep(1000);
            sp.Write(data,0,data.Length);
            sp.DiscardOutBuffer();
        }

        Console.WriteLine("End of transmission");
        Console.ReadKey();
    }
我经常在另一边看到以下116个字节(奇怪的是,消息以原始的CRC字节结尾??)

如果您能帮助解决此问题,我们将不胜感激

谢谢

我找到了问题

Tibbo模块上似乎启用了“带内命令”设置,禁用该设置后,它停止使用额外的0xFF字节“填充”0xFF字节

非常奇怪,因为原始modbus从机发送了大量0xFF字节,但它没有这样做。

我发现了问题

Tibbo模块上似乎启用了“带内命令”设置,禁用该设置后,它停止使用额外的0xFF字节“填充”0xFF字节


非常奇怪,因为原始的modbus从机发送大量的0xFF字节,但它没有这样做。

因此,所有的0xFF字节都会出现双重升级。您是否也有接收器代码?嗨,接收器是一个Tibbo RS232到IP模块。我已经用modbus从机测试了这个模块,它工作正常,只是.net应用程序不能正确地“传输”原始数据。看起来是这样的。你为什么要调用sp.discarderBuffer()?如果串行端口的硬件缓冲区中还有剩余字节,它将丢弃这些字节。这看起来就像是在发生一样。@MatthewWatson嗨,我只是想以防万一,但这没有什么区别,我得到的116个字节永远在那里……所以你得到的是所有0xFF字节的双重递增。您是否也有接收器代码?嗨,接收器是一个Tibbo RS232到IP模块。我已经用modbus从机测试了这个模块,它工作正常,只是.net应用程序不能正确地“传输”原始数据。看起来是这样的。你为什么要调用sp.discarderBuffer()?如果串行端口的硬件缓冲区中还有剩余字节,它将丢弃这些字节。马修沃森:嗨,我只是想以防万一,但这没有什么区别,我得到的116字节永远都在那里。。。。
0xa, 0x03, 0x64, 0x0e, 0x15, 0x00, 0x01, 0x00,
0x01, 0x00, 0x06, 0x00, 0x23, 0x00, 0x5f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xb8, 0x00,
0x05, 0xff, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00,
0x00, 0xa2, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04,
0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xae, 0x1f,