首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#串口通信从缓存中取出的数据的有关问题

2013-03-28 
C#串口通信从缓存中取出的数据的问题本人用C#刚接触串口通信不久,在网上找了一些串口通信的资料,按照资料

C#串口通信从缓存中取出的数据的问题
本人用C#刚接触串口通信不久,在网上找了一些串口通信的资料,按照资料中的讲解做了个串口通信程序,但是在和下位机通信的时候接收到的数据总是不对,不知道是什么原因,哪位懂C#串口通信的大侠能指点下吗?
正确的数据格式应该是这样的:F0 55 AA 04 07 0D 01 00 02 00 03 00 04 0D 00 0F 00 13 00 04 00 14 00 98 00 03 00 0B 00 83 00 7C 00 07 00 7F 00 80 00 88 9C 9C 但是不知道为什么我用程序中的代码接收到的数据格式却是这样的:AA AA 00 00 00 00 00 00 00 AA AA 04 04 04 0F 00 00 00 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 。哪位大侠能告诉我问题出在哪里吗?
下面是我的发送程序的代码:
  //处理数字转换,目的是将输入的字符按空格、“,”等分组,以便发送数据时的方便(此处转的比较麻烦,有高见者,请指点!)  
                comm.RtsEnable = true;
                //comm.Parity = Parity.Mark;
                Thread.Sleep(2);
               // comm.Parity = Parity.Mark;

                
               
                
                byte[] byteBuffer2 = new byte[9];
                byteBuffer2[0] = 0xaa;
                byteBuffer2[1] = 0xaa;
                byteBuffer2[2] = 0x04;
                byteBuffer2[3] = 0x04;
                byteBuffer2[4] = 0x04;
                byteBuffer2[5] = 0x0f;
                byteBuffer2[6] = 0x00;
                byteBuffer2[7] = 0x00;
                byteBuffer2[8] = 0x00;
                
                String strSend2 = byteBuffer2[0].ToString("X2") + " " + byteBuffer2[1].ToString("X2") + " " + byteBuffer2[2].ToString("X2") + " " + byteBuffer2[3].ToString("X2") + " " + byteBuffer2[4].ToString("X2") + " " +
                                   byteBuffer2[5].ToString("X2") + " " + byteBuffer2[6].ToString("X2") + " " + byteBuffer2[7].ToString("X2") + " " + byteBuffer2[8].ToString("X2");


       
                string sendBuf2 = strSend2;
                string sendnoNull2 = sendBuf2.Trim();
                string sendNOComma6 = sendnoNull2.Replace(',', ' ');    //去掉英文逗号  
                string sendNOComma7 = sendNOComma6.Replace(',', ' '); //去掉中文逗号  
                string strSendNoComma8 = sendNOComma7.Replace("0x", "");   //去掉0x  
                strSendNoComma8.Replace("0X", "");   //去掉0X  
                string[] strArray2 = strSendNoComma8.Split(' ');

                List<byte> buf2 = new List<byte>();//填充到这个临时列表中  
                //依次添加到列表中  
                int byteBufferLength2 = strArray2.Length;
                for (int i = 0; i < strArray2.Length; i++)
                {
                    byte str2 = byte.Parse(strArray2[i].ToString(), System.Globalization.NumberStyles.HexNumber);
                    buf2.Add(str2);
                   
                }
                
                //转换列表为数组后发送
               
                comm.Write(buf2.ToArray(), 0, buf2.Count);
                Thread.Sleep(60);

                comm.RtsEnable = false;
                //Thread.Sleep(16);
                comm.Parity = Parity.Mark;

接收部分的代码如下
   void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
           
            //更新界面  
            //this.Invoke((EventHandler)(delegate { richTextBox1.Text = ""; }));


            //buffer.RemoveAt(0);
            Thread.Sleep(500);//此处一定要有,休眠一段 时间利用缓存来接收数据,经测试75秒刚好
            if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环  
            try
            {
                Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。  
                int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致  
                byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据  
                received_count = n;//增加接收计数  
                //richTextBox3.Text = received_count.ToString();
                //MessageBox.Show(received_count.ToString());
                comm.Read(buf, 0, n);//读取缓冲数据  
                builder.Length=0;//清除字符串构造器的内容  

                //<协议解析>  
                bool data_1_catched = false;//缓存记录数据是否捕获到 
                buffer.AddRange(buf);
                if (buffer.Count >=9)
                {
                    string data,data1;
                    data = "";
                    data1 = "";
                    //MessageBox.Show(buf[8].ToString("X2"));
                    for (int i = 0; i < n; i++)
                    {
                        data1 += buffer[i].ToString("X2") + " ";
                        data += buf[i].ToString("X2") + " ";
                       // data = n.ToString();
                    }


                    //更新界面  
                    this.Invoke((EventHandler)(delegate { richTextBox4.Text = data; }));
                    this.Invoke((EventHandler)(delegate { richTextBox3.Text = data; }));
 //因为要访问ui资源,所以需要使用invoke方式同步ui。  
                    this.Invoke((EventHandler)(delegate
                    {
                        //判断是否是显示为16禁止  
                        if (checkBox3.Checked)
                        {
                            //依次的拼接出16进制字符串  
                            foreach (byte b in buf)
                            {
                                builder.Append(b.ToString("X2") + " ");
                            }
                        }
                        else
                        {
                            //直接按ASCII规则转换成字符串  
                            builder.Append(Encoding.ASCII.GetString(buf));
                        }
                        //追加的形式添加到文本框末端,并滚动到最后。  
                        richTextBox1.AppendText(builder.ToString());
                       // richTextBox1.Text=builder.ToString();
                        //修改接收计数  


                        //labelGetCount.Text = "Get:" + received_count.ToString();
                    }));  
                
                }
                 
                
                
            }
            finally
            {
                Listening = false;//我用完了,ui可以关闭串口了。  
            }  

        }
[解决办法]
帮你顶下
那么多3F可能是由于发送了ASCII码以外的字符,但是却是以ASCII码的形式发送的,导致编码为“?”,对应ASCII值为3F

热点排行