本帖最后由 u011825449 于 2013-08-26 14:01:49 编辑

解决方案 »

  1.   

    这是我写的代码,请高手看看那里出错了?
    void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                if (IsClosing)
                    return;
                try
                {
                    Listening = true;
                    int n = comm.BytesToRead;  
                    byte[] buf = new byte[n];
                    received_count += n;
                    comm.Read(buf, 0, n);//读取缓冲数据  
                   
                    bool data_1_catched = false;//缓存记录数据是否捕获到  
                   
                    buffer.AddRange(buf);
                     
                    while (buffer.Count >= 8)
                 
                    {
                        if (buffer[0] ==0x16 && buffer[1] == 0x16 && buffer[2] == 0x01 && buffer[3] == 0x30
                           && buffer[4] == 0x30 && buffer[5] == 0x02 && buffer[62]==0x03)
                     
                        {
                            
                            int len = n - 8;                        if (buffer.Count < len + 8)
                                break;
                            else
                            {
                                byte checksum = 0;
                                for (int i = 2; i <len + 7; i++)
                                {
                                    checksum ^= buffer[i];
                                }
                                if (checksum != buffer[len + 7])
                                {
                                    buffer.RemoveRange(0, len + 8);                                continue;
                                }
                                else
                                { 
                                    buffer.CopyTo(0, Hex_data_1, 0, len + 8);
                                
                                }
                            }
        
                            data_1_catched = true;
                            buffer.RemoveRange(0, len + 8);
         
                        }
                        else
                        {
                          
                            buffer.RemoveAt(0);
                        }
                      
                    }
                    
                        builder.Clear();//清除字符串构造器的内容  
                    //因为要访问ui资源,所以需要使用invoke方式同步ui。  
                    this.Invoke((EventHandler)(delegate
                    {
                        //判断是否是显示为16进制  
                        if (checkBoxHexView.Checked)
                        {
                            //依次的拼接出16进制字符串  
                            foreach (byte b in buf)
                           // foreach (byte b in buf)
                            {
                                builder.Append(b.ToString("X2") + " ");
                                string bStr = b.ToString("X2");
                                if (bStr == "FF" || bStr == "EF")
                                {
                                    builder.Append("\r\n");
                                }
                            }
                        }
                        else
                        {
                            //直接按ASCII规则转换成字符串  
                            builder.Append(Encoding.ASCII.GetString(buf));
                        }
                        //追加的形式添加到文本框末端,并滚动到最后。 
                         string temp = buffer.ToString();
                        string result="";
                        for (int m = 0; m <=n; m++)
                        {
                            
                            result = result + Convert.ToString(buffer[m]);
                           
                        }
                        txGet.Text = result;
                        //修改接收计数  
                        labelGetCount.Text = "Get:" + received_count.ToString();
                    }));
                }
                finally
                {
                    Listening = false;//我用完了,ui可以关闭串口了
                }
            }
      

  2.   


     int n = comm.BytesToRead;  我想请教一下上面的代码,我调用ByteToRead成员时抛出“端口已关闭”的异常,可能是什么原因。我加入监视,其实在调用ByteToRead前端口都是打开的。