Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1066985
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类: C/C++

2011-05-26 15:26:48

肯定没有boost 的ringbuf 写的好,但是可以在单片机编程中使用。单片机上没法使用boost,所以自己写一个,用在串口接收数据时。
  1. template <class T>
  2. class RingBuf
  3. {
  4. public:
  5.     RingBuf(unsigned ringBufSize)
  6.         : m_bufferSize(ringBufSize)
  7.         , m_pBuffer(NULL)
  8.         , m_head(0)
  9.         , m_tail(0)
  10.     {
  11.         m_pBuffer = new T[ringBufSize];
  12.     }
  13.     ~RingBuf()
  14.     {
  15.         if (m_pBuffer != NULL)
  16.         {
  17.             delete[] m_pBuffer;
  18.             m_pBuffer = NULL;
  19.         }
  20.     }
  21. public:
  22.     unsigned Count()
  23.     {
  24.         if (m_head < m_tail)
  25.         {
  26.             m_head = m_head % m_bufferSize;
  27.             m_tail = m_tail % m_bufferSize;
  28.         }
  29.         unsigned head = m_head;
  30.         unsigned tail = m_tail;
  31.         if (head < tail)
  32.         {
  33.             return (tail - head + m_bufferSize);
  34.         }
  35.         else
  36.         {
  37.             return (head - tail);
  38.         }
  39.     }


  40.     bool IsFull()
  41.     {
  42.         return (Count() >= m_bufferSize);
  43.     }
  44.     bool IsEmpty()
  45.     {
  46.         return (Count() == 0);
  47.     }
  48.     bool Peek(T &value)
  49.     {
  50.         if (! Empty())
  51.         {
  52.             value = m_pBuffer[m_tail % m_bufferSize];
  53.             return true;
  54.         }
  55.         return false;
  56.     }
  57.     bool Pop(T &value)
  58.     {
  59.         if (! IsEmpty())
  60.         {
  61.             value = m_pBuffer[m_tail % m_bufferSize];
  62.             m_tail ++;
  63.             return true;
  64.         }
  65.         return false;
  66.     }
  67.     bool Push(T value)
  68.     {
  69.         if (IsFull())
  70.         {
  71.             T popValue;
  72.             Pop(popValue);
  73.         }

  74.         m_pBuffer[m_head % m_bufferSize] = value;
  75.         m_head++;
  76.         return true;
  77.     }

  78.     RingBuf &operator += (T value) {
  79.         Push(value);
  80.         return *this;
  81.     }

  82.     bool PushString(T *pDataSource, unsigned pushLen)
  83.     {
  84.         for (int i=0; i<pushLen; i++)
  85.         {
  86.             Push(pDataSource[i]);
  87.         }
  88.         return true;
  89.     }
  90.     bool PopString(T *pDataDest, unsigned popLen)
  91.     {
  92.         if (Count() < popLen)
  93.         {
  94.             return false;
  95.         }

  96.         for (int i=0; i<popLen; i++)
  97.         {
  98.             Pop(pDataDest[i]);
  99.         }

  100.         return true;
  101.     }
  102.     void Flush()
  103.     {
  104.         m_head = m_tail;
  105.     }

  106. //==================================================================

  107. //==================================================================

  108. private:
  109.     volatile unsigned m_head; /* first byte of data */
  110.     volatile unsigned m_tail; /* last byte of data */
  111.     T                 *m_pBuffer; /* block of memory or array of data */
  112.     unsigned          m_bufferSize; /* leng
    }

这是部分代码,但是是全部的ring buf, 串口接收到数据时中断一次往里面 push 一个字节,然后判断添加点代码判断数据完整性等操作。
阅读(1618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~