串口接收处理--非中断方式

最近使用的一个传感器,在上电后1s内可以读id,之后就会自动转为持续检测模式。因此在初始化时对传感器进行获取ID的操作。获取id时接收选择轮询模式

接收函数:

 int recv_cmd(uint32_t usart_periph,uint8_t *buf,uint8_t size)
{
	uint32_t rcvdelay = 50000;
	if (NULL == buf)
	{
		vDebugPrintf(printf_ERR,"{%s} buf point is null\r\n",__func__);
		return -1;
	}
	for(int i=0; i<size; i++)
	{
		while (usart_flag_get(usart_periph, USART_FLAG_RBNE) == RESET)
		{
			delay_us(1);
			if (--rcvdelay)
			{
				continue;
			}
			else 
			{
				vDebugPrintf(printf_ERR,"{%s} can not receive value\r\n",__func__);
				return -1;
			}
		}
		rcvdelay = 50000;
		buf[i] = usart_data_receive(usart_periph);
	}
	
	return 0;
}

当计数器由50000减到0时,接收寄存器RBNE还没有数据就return出来

发送函数:

 int set_cmd(uint32_t usart_periph,uint8_t index)
{
	uint8_t cmd_step[MATERIAL_LOC_CMD_MAX][MATERIAL_CMD_TOTAL_SIZE]={
		{0x55, 0xAA, 0x0D, 0x0C},/*single detect*/
		{0x55, 0xAA, 0x0C, 0x0B},/*continue detect*/
		{0x55, 0xAA, 0x0B, 0x0A},/*stop detect*/
		{0x55, 0xAA, 0xFF, 0xFF},/*reset*/
		{0x55, 0xAA, 0xEE, 0xEE}/*get id*/
	};
	
	if (index >= MATERIAL_LOC_CMD_MAX)
	{
		vDebugPrintf(printf_ERR, "%s:CMD step is too large\r\n",__func__);
		return -1;
	}
	/*set data by step*/
	uint8_t sendbuf[MATERIAL_CMD_TOTAL_SIZE]; 
	memcpy(sendbuf,&cmd_step[index][0],MATERIAL_CMD_TOTAL_SIZE);
	for (int i=0;i<sizeof(sendbuf);i++)
    {
    	while(RESET == usart_flag_get(usart_periph, USART_FLAG_TBE));
		usart_data_transmit(usart_periph, sendbuf[i]);
	}
	return 0;
}

获取id函数:

int get_version(uint32_t usart_periph)
{
	uint8_t version_info[14] = {0};
	uint8_t id[14] = {0x5A, 0x00, 0x43, 0x51, 0x2D, 0x55, 0x4C, 0x2D, 0x4D, 0x44, 0x2D, 0x30, 0x31, 0x08};
	if (0 == material_loc_set_cmd(usart_periph,4))
	{
		if (0 == material_loc_recv_cmd(usart_periph,version_info,sizeof(version_info)))
		{
			if (memcmp(id,version_info,sizeof(version_info)))
			{
				vDebugPrintf(printf_BSP,"{%s} error1 [%x %x]\r\n",__func__,version_info[2],version_info[3]);
				return -1;
			}
			return 0;
		}
		else
		{
			vDebugPrintf(printf_BSP,"{%s} error2 [%x %x]\r\n",__func__,version_info[2],version_info[3]);
			return -1;
		}
	}
	else
	{
		vDebugPrintf(printf_BSP,"{%s} error3 [%x %x]\r\n",__func__,version_info[2],version_info[3]);
		return -1;
	}
}

之后持续监测的数据使用串口空闲中断+DMA的方式去获取和解析

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值