C#串口编程问题:一个测试数据怎么拆分成2个字符串,做了2次发送?

最近采用C#串口编程遇到一个问题:一个测试数据怎么拆分成2个字符串,做了2次发送,屏幕显示的字符总是少了几位,
 
输出的数据是这样的:
 
2013-06-26 09:38:29 XR1000229E-2,GO 
2013-06-26 09:39:20 XR1000244E-
2013-06-26 09:39:20 2,GO 
2013-06-26 09:39:27 XR1000244E-2,GO 
2013-06-26 09:39:29 XR1000250E-2,GO 
2013-06-26 09:39:34 XR1000242E-2,GO 
2013-06-26 09:39:34 
2013-06-26 09:39:36 XR1000240E-2,GO 
2013-06-26 09:39:38 XR1000242E-2,GO 
2013-06-26 09:39:39 XR100024
2013-06-26 09:39:39 7E-2,GO 
2013-06-26 09:39:41 XR100
2013-06-26 09:39:41 0252E-2,GO 
 
 

原来的代码设计:

 private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {            

            Invoke(new MethodInvoker(delegate()
            {
                int N = this.sp.BytesToRead;
                byte[] RecieveBuf = new byte[N];
                this.sp.Read(RecieveBuf, 0, N);

                 string strRecieve3 = System.Text.Encoding.Default.GetString(RecieveBuf);                
                 this.txtValue.Text = strShow;
                 
            }));
        }


分析:发送E后,等待内存缓冲是否够“XR0001095E+1,LO”字符,如果接收的长度正确,才输出结果,否则等待继续接收,也就是第二次的接收。



改善后的代码:


        /***************************************
         * 接受串口数据并存储
         * *************************************/
        private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        { 
            Invoke(new MethodInvoker(delegate()
            {
                int N = this.sp.BytesToRead;
                byte[] RecieveBuf = new byte[N];
                this.sp.Read(RecieveBuf, 0, N);


                lock (list_lock)
                {
                    list_byteArray.Add(RecieveBuf);
                }


                WriteLog();
                
            }));

        }


         /**************************************
         * 将接收的数据写入 日志
         * ************************************/
        public void WriteLog()
        {
            if (list_byteArray.Count > 0)
            {
                lock (list_lock)
                {


                    byte[] RecieveBuf = (byte[])list_byteArray[0];                 
                    str_recieveData += System.Text.Encoding.Default.GetString(RecieveBuf);


                    if (str_recieveData.IndexOf("\0\n") > -1)
                    {
                        string[] arr = System.Text.RegularExpressions.Regex.Split(str_recieveData, "\0\n");
                        string frame = arr[arr.Length - 2];
                        if (frame.Length == 15)
                        {
                            //this.txtValue.Text = frame;
                            str_recieveData = "";

                            txtValue.Text = GetSubTestValue(frame);
                            int iIndex = frame.LastIndexOf(',');
                            txtResult.Text = frame.Substring(iIndex + 1, 2); 

                        }
                        else if (frame.Length < 15)
                        {
                            str_recieveData = frame;
                        }
                    }                  


                    //移除已经读到的数据
                    list_byteArray.RemoveAt(0);
              
                
                }
            }


        }


 
 


 

你可能感兴趣的:(BS开发,移动开发,Windows应用程序开发,其他)