标题:c# 串口接收数据问题,请大家帮帮忙,谢谢!
只看楼主
初识CSharpe
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-5
结帖率:33.33%
已结贴  问题点数:16 回复次数:3 
c# 串口接收数据问题,请大家帮帮忙,谢谢!
欲从串口读取单片机发送过来的数据,然后将所接收的数据解析!
由于单片机是一个字节一个字节的发送,而我的解析函数是一组数据一组数据的解析(一组数据是18个字节)。
解决办法是:
1、将每一次接收的数据复制到一个数组中;
2、然后获取数组每18个字节为一组进行解析;
如何实现呢,麻烦各位大侠能支支招,谢谢!
搜索更多相关主题的帖子: 单片机 如何 
2011-11-16 15:54
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
得分:16 
由于读串口数据只能用定时器轮询的读,所以可能一次读的多于18个字节

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2011-11-17 10:07
初识CSharpe
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-5
得分:0 
谢谢jedypjd网友,是的,利用断点方式调试读取串口发送过来的数据时,发现有时小于18,但大多数是远远大于18,为此,想解决每次接收的数据以每18个字节为一组的读取出来,利用队列形式。

以下是实现队列方法,但有些代码不知怎么写,请高手支招,谢谢!:
 
        int sindex=0;  //定义队列首指针
        int eindex=0;  //定义队列尾指针

        const int bufSIZE = 500;//数据大小
        byte[] Sbuffer = new byte[bufSIZE];
        //串口接收数据
        private void COMPort_DataReceived(object sender, SerialDataReceivedEventArgs e)//接收
        {
            int i=0,con;

            int bytes = ComPort.BytesToRead;//获取接收缓冲区中数据的字节数

            byte[] buffer = new byte[bytes];//定义所获取字节数大小的缓冲区

            ComPort.Read(buffer, 0, bytes);//输入缓冲区读取的一些字节并将那些字节写入字节数组中指定的偏移量处

            //将数据放在自定义缓冲区Sbuffer 内
            con=((bufSIZE-eindex)>buffer.Length)?buffer.Length:bufSIZE-eindex;  //比较用于存放的缓冲区与接收的字节缓冲区,若接收的字节数大于定义的缓冲区大小,那么                                                                               // 常量赋值为定义的缓冲区大小;反之为实际接收的缓冲区大小。

            System.Buffer.BlockCopy(buffer, eindex, Sbuffer, 0, con); //将指定数目的字节con从起始于特定偏移量eindex的源数组复制到起始于特定偏移量0的目标数组Sbuffer。

            if(con<buffer.Length)
            {
                if((buffer.Length-con)<sindex)
                {
                    System.Buffer.BlockCopy(buffer, eindex, Sbuffer, 0, buffer.Length-con);
                    eindex= buffer.Length-con;
                }
                else
                {

                }
            }
            else
            {
                eindex=eindex+con;
            }

            //取一个完整的包
            while(true)
            {
              while((Sbuffer[sindex]!=0xff)&&(eindex!=sindex))
                {
                  sindex=(++sindex)%bufSIZE;
                }

              if((eindex>sindex)&&((eindex-sindex)>=18))
              {

                {               
               
                }

               sindex=(18+sindex)%bufSIZE;

              }
              else if((eindex<sindex)&&((eindex+bufSIZE-sindex)>18))
              {
                 {}
                 sindex=(18+sindex)%bufSIZE;
               }
              else break;
            }

            if (sindex == 0)
            {
                while ((buffer[i] != 0xff) && (i < buffer.Length)) { i++; }
                if (i < buffer.Length)
                {
                    System.Buffer.BlockCopy(buffer, i, Sbuffer, 0, buffer.Length - i);
                    sindex = buffer.Length - i;
                }
            }
            else
            {
                System.Buffer.BlockCopy(buffer, i, Sbuffer, sindex, buffer.Length );
                sindex = sindex + buffer.Length;
            }

            if (sindex >= 18)
            {
                { }

            }


            //
            Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));

            CheckData(buffer);  //检验接收的数据正确性
        }
2011-11-17 10:41
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
得分:0 
怎么感觉是C++里面的解决思路
C#中串口是有一些可以直接用的方法的
比如string data = serialPort1.ReadExisting();
关于收取平衡,可以弄个大的容器,比如十万个字节,也是一种办法
不是非得弄个循环队列的结构增加复杂度

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2011-11-17 12:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-355397-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.103382 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved