串口接收二维数组环形缓冲队列

串口接收二维数组环形缓冲队列

51单片机使用此方法可能效果不大。
此二维数组环形缓冲队列是我从一维数组环形缓冲队列改编而来,与一维数组理念相同。但是对于数据的处理要更加的方便。
 环形缓冲区就是一个带“头指针”和“尾指针”的数组。“头指针”指向环形缓冲区中可读的数据,“尾指针”指向环形缓冲区中可写的缓冲空间。通过移动“头指针”和“尾指针”就可以实现缓冲区的数据读取和写入。在通常情况下,应用程序读取环形缓冲区的数据仅仅会影响“头指针”,而串口接收数据仅仅会影响“尾指针”。当串口接收到新的数组,则将数组保存到环形缓冲区中,同时将“尾指针”加1,以保存下一个数据;应用程序在读取数据时,“头指针”加1,以读取下一个数据。当“尾指针”超过数组大小,则“尾指针”重新指向数组的首元素,从而形成“环形缓冲区”!,有效数据区域在“头指针”和“尾指针”之间。

环形缓冲区就是一个带“头指针”和“尾指针”的数组。“头指针”指向环形缓冲区中可读的数据,“尾指针”指向环形缓冲区中可写的缓冲空间。通过移动“头指针”和“尾指针”就可以实现缓冲区的数据读取和写入。在通常情况下,应用程序读取环形缓冲区的数据仅仅会影响“头指针”,而串口接收数据仅仅会影响“尾指针”。当串口接收到新的数组,则将数组保存到环形缓冲区中,同时将“尾指针”加1,以保存下一个数据;应用程序在读取数据时,“头指针”加1,以读取下一个数据。当“尾指针”超过数组大小,则“尾指针”重新指向数组的首元素,从而形成“环形缓冲区”!,有效数据区域在“头指针”和“尾指针”之间。

typedef struct rcv_buff
{
	unsigned char pop_head;
	unsigned char pop_tail;
	unsigned char buf[10][50];
}rh_bluebuff_t;

rh_bluebuff_t rh_buff;

void Uart2() interrupt 8 using 1
{
	  int i = 0;
    if(S2CON & S2RI)
    {
        S2CON &= ~S2RI;         //清除S2RI位
				buff_write(S2BUF);
//        P2 = (S2CON & S2RB8);   //P2.2显示校验位
    }
    if(S2CON & S2TI)
    {
        S2CON &= ~S2TI;         //清除S2TI位
        busy = 0;               //清忙标志
    }
}
void buff_write(unsigned char data_t)
{
	unsigned char _temp;
	
	if(data_t != '\n')
	{
			rh_buff.buf[rh_buff.pop_tail][buf_count] = data_t;          //从尾部追加
			buf_count++;
		  if(buf_count>=50) buf_count = 49;
	}	
	else
	{
			rh_buff.buf[rh_buff.pop_tail][buf_count] = data_t;          //从尾部追加
			buf_count = 0;
		
#if 1	
		  _temp = (rh_buff.pop_tail + 1);  //_temp = (rh_buff.pop_tail + 1) % 10;  stc不能取余
		  if(_temp >= 10) _temp = 0;
		  if(_temp != rh_buff.pop_head)
		  {
				 rh_buff.pop_tail = _temp;
			}		
#else		
			if(++rh_buff.pop_tail >= 10)         												//尾节点偏移
					rh_buff.pop_tail=0;                      									//大于数组最大长度 归零 形成环形队列
			if(rh_buff.pop_tail == rh_buff.pop_head)//如果尾部节点追到头部节点,则修改头节点偏移位置丢弃早期数据
			{
					if(++rh_buff.pop_head >= 10)
					{
							rh_buff.pop_head = 0;
					}
			}
#endif			
	}  
}

unsigned char buff_read(unsigned char *data_t)
{
	if(rh_buff.pop_head == rh_buff.pop_tail)    //如果头尾接触表示缓冲区为空
  {
			return 1;   //返回1,环形缓冲区是空的
  }
  else
  {
			memcpy(data_t, &rh_buff.buf[rh_buff.pop_head][0], 50);
			memset(&rh_buff.buf[rh_buff.pop_head][0], 0, 50);
			if(++rh_buff.pop_head >= 10)
			{
					rh_buff.pop_head = 0;
			}
			return 0;     //返回0,表示读取数据成功
  }
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在OpenMV中,您可以使用Python的`struct`模块将二维数组打包成二进制数据,然后通过串口发送。以下是一个示例代码,演示了如何将一个2x3的整数数组打包并通过串口发送: ```python import struct from pyb import UART # 初始化串口 uart = UART(3, 115200) # 创建一个2x3的整数数组 my_array = [[1, 2, 3], [4, 5, 6]] # 将数组打包成二进制数据 packed_data = struct.pack('6h', *sum(my_array, [])) # 发送数据 uart.write(packed_data) ``` 在上面的示例中,我们首先导入了Python的`struct`模块和OpenMV的UART模块。然后,我们创建了一个2x3的整数数组`my_array`,并将其展开为一维数组,然后使用`struct.pack()`将其打包成二进制数据。在这个例子中,我们使用了格式字符串`'6h'`,表示打包6个有符号短整型数(即6个整数)。最后,我们使用`uart.write()`函数将打包后的数据发送到串口。 在接收端,您可以使用`struct.unpack()`函数将接收到的二进制数据解包成一个二维数组。以下是一个简单的示例: ```python import struct from pyb import UART # 初始化串口 uart = UART(3, 115200) # 接收数据 packed_data = uart.read(12) # 解包成二维数组 my_array = struct.unpack('6h', packed_data) my_array = [my_array[:3], my_array[3:]] print(my_array) ``` 在上述示例中,我们使用`uart.read()`函数从串口读取12个字节的数据。然后,我们使用`struct.unpack()`函数将接收到的二进制数据解包成一个包含6个整数的元组,最后将其转换为一个2x3的整数数组`my_array`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值