none
这个程序为什么我读回来的数据会乱呢? RRS feed

  • 问题

  • 老师你好!

    我的程序如下:

    using System.IO.Ports;
    using System.Threading;

    namespace ConsoleApp1
    {
        public class PortChat
        {
            static SerialPort _serialPort;
            static byte K5_red_Save = 0;
            static byte[] K5_red = new byte[20];
            static byte[] K1_alarm = new byte[10]
            {
                0x01,0x0F,0x00,0x00,0x00,0x08,0x01,0xAA,0x7E,0xEA
            };
            static byte[] K2_red = new byte[10]
            {
                0x01,0x0F,0x00,0x00,0x00,0x08,0x01,0x55,0x3E,0xAA
            };
            static byte[] K3_red = new byte[10]
            {
                0x01,0x0F,0x00,0x00,0x00,0x08,0x01,0xFF,0xBE,0xD5
            };
            static byte[] K4_red = new byte[8]
            {
               0x01,0x02,0x00,0x00,0x00,0x08,0x79,0xCC
            };
            static byte[] All_off = new byte[10]
            {
               0x01,0x0F,0x00,0x00,0x00,0x08,0x01,0x00,0xFE,0x95
            };
            public static void Main()
            {
                    _serialPort = new SerialPort();
                    _serialPort.PortName = "COM10";
                    _serialPort.BaudRate = 9600;
                    _serialPort.Parity = Parity.None;
                    _serialPort.DataBits = 8;
                    _serialPort.StopBits = StopBits.One;
                    _serialPort.Handshake = Handshake.None;
                    _serialPort.ReadTimeout = 500;
                    _serialPort.WriteTimeout = 500;
                    _serialPort.Open();
               
                while (true)
                {
                    //_serialPort.DiscardOutBuffer();
                    //Thread.Sleep(20);
                    K5_red_Save = K5_red[3];
                    _serialPort.Write(K4_red, 0, 8);
                    Thread.Sleep(20);
                    _serialPort.Read(K5_red, 0, 20);
                    Thread.Sleep(20);
                   
                    if (K5_red[3] != K5_red_Save)
                    {
                        switch (K5_red[3])
                        {
                            case 1:
                                _serialPort.Write(K1_alarm, 0, 10);
                                Thread.Sleep(10);
                                break;
                            case 2:
                                _serialPort.Write(K2_red, 0, 10);
                                Thread.Sleep(10);
                                break;
                            case 4:
                                _serialPort.Write(K3_red, 0, 10);
                                Thread.Sleep(10);
                                break;
                            case 8:
                            //case 0:
                                _serialPort.Write(All_off, 0, 10);
                                Thread.Sleep(10);
                                break;
                        }
                    } 
                   
                }
            }
        }
    }

    我现在的问题是:   _serialPort.Read(K5_red, 0, 20);这一句,我串口设备外部没有变化的情况下,K5_red第一次数据正常,第二次数据异常,第三次数据正常,第四次数据异常。。。。。。请教老师帮我分析下,到底哪里出了问题?

    另:如果我把IF这个程序块注释掉,则读取数据一切正常。这哪里出了问题?谢谢!!!

    2019年8月13日 6:27

答案

  • 老师你好,经过我反复测试,我把Thread.Sleep(20);这样的语句改为Thread.Sleep(60);后问题消失,在改回来问题又出现,我推测应该是串口设备相应问题。

    关于你提到程序不会执行的问题,因为赋值和比较之间会有串口读回数据,K5_red[3]的值会改变,所以程序会执行。

    谢谢你的答复!!

    2019年8月14日 4:03

全部回复

  • 还有,我这程序这样写应该不是好的结构,应该怎样优化?请老师指点迷津,谢谢!!!
    2019年8月13日 6:30
  • Hi,

    抱歉,我这里不能进行串口设备的代码测试,对这些设备也不太了解。但是我注意到你使用“K5_red_Save = K5_red[3];”对K5_red_Save赋值,然后在没有修改任何数据的情况下进行比较“K5_red[3] != K5_red_Save”,但这两者始终是相等的。if语句的判断结果始终为False,if中的代码始终不会执行。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年8月14日 2:41
    版主
  • 这个问题我也遇到过,read的数据错误是什么样的错误,是返回的位数变了吗,还是数据不对,目前来看代码是没有问题的,可能是发送消息的设备问题
    2019年8月14日 3:14
  • 老师你好,经过我反复测试,我把Thread.Sleep(20);这样的语句改为Thread.Sleep(60);后问题消失,在改回来问题又出现,我推测应该是串口设备相应问题。

    关于你提到程序不会执行的问题,因为赋值和比较之间会有串口读回数据,K5_red[3]的值会改变,所以程序会执行。

    谢谢你的答复!!

    2019年8月14日 4:03