自定义通信指令协议——CW32单片机与九齐051f

协议内容:

自定协议:该协议分为头部、数据部、尾部三个部分,默认状态为高电平,协议头部为持续4ms低电平,数据部为1-12ms的高电平(分别对应不12个挡位),尾部为持续4ms的低电平。

接收:识别头部、数据部分、尾部,并通过识别到的协议选择挡位。

示意图

在这里插入图片描述

代码

发送(CW32单片机)

只是把关键函数写出来供大家学习,并没有把整套代码copy过来。

void Send_Protocol()
{
	if(Protocol_Status)
	{
		if(Time_Send_Protocol >=1){
			Protocol_cnt++;
			Time_Send_Protocol = 0;
		}
		if(Protocol_cnt <=  FIXED_4MS){ //4ms
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_RESET);
		}
		else if(Protocol_cnt <= Protocol_time +   FIXED_4MS){		//4ms + N ms
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_SET);	
		}
		else if(Protocol_cnt <= (Protocol_time +   2 * FIXED_4MS)){ //4ms + N ms  +4ms
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_RESET);
		}
		else{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_5,GPIO_PIN_SET);
			Protocol_Status = 0;
			Protocol_time = 0;
		}
	}
	
}

接收(九齐单片机)

//直接全程用延时
void Check_Protocol(void){	
	
	if(PORTBbits.PB2 == RESET)
	{
		delay_time = 0;
		recv_num = 0;
		delay_500us();
		while(PORTBbits.PB2 != SET)
		{
			delay_time++;
			delay_1ms();
			if(delay_time >= 20){
				return;
			}
		}
		if(delay_time<2|| delay_time>5)
		{
			return;
		}
		
		while(PORTBbits.PB2 == SET)
		{
			recv_num++;
			delay_1ms();
			if(recv_num >= 50){
				return;
			}
		}
		
		delay_time =0;
		while(PORTBbits.PB2 != SET)
		{
			delay_time++;
			delay_1ms();
			if(delay_time >= 20){
				return;
			}
		}
		if(delay_time<2 || delay_time>5)
		{
			return;
		}
	}
	
	if(PORTBbits.PB3 == RESET)
	{

	
		
		delay_time = 0;
		recv_num = 0;
		delay_500us();
		while(PORTBbits.PB3 != SET)
		{
			delay_time++;
			delay_1ms();
			if(delay_time >= 20){
				return;
			}
		}
		if(delay_time<2|| delay_time>5)
		{
			return;
		}
		
		while(PORTBbits.PB3 == SET)
		{
			recv_num++;
			delay_1ms();
			if(recv_num >= 50){
				return;
			}
		}
		
		delay_time =0;
		while(PORTBbits.PB3 != SET)
		{
			delay_time++;
			delay_1ms();
			if(delay_time >= 20){
				return;
			}
		}
		if(delay_time<2 || delay_time>5)
		{
			return;
		}
	}
//exc
	if(recv_num != 0){
		iic_SwitchSend(recv_num);
		recv_num = 0;
	}
	else{
		return;
	}

}

数据选挡


#define Gear0		(10)
#define Gear1		(20)
#define Gear2		(30)
#define Gear3		(40)
#define Gear4		(60)
#define Gear5		(80)
#define Gear6		(100)
#define Gear7		(120)
#define Gear8		(140)
#define Gear9		(160)
#define Gear10		(180)
#define Gear11		(250)

void iic_SwitchSend(uint8_t recv){

	iic_init();				//重新初始化
		
	iic_sdin_set();
	iic_sclk_set();			//先拉高,准备发送
	delay_1ms();


	switch(recv){
		case 1:
				//Gear0
			break;
		case 2:
				//Gear1
			break;
		case 3:
				//Gear2
			break;
		case 4:
				//Gear3
			break;
		case 5:
				//Gear4
			break;
		case 6:
				//Gear5
			break;
		case 7:
				//Gear6
			break;
		case 8:
				//Gear7
		break;
		case 9:
				//Gear8
			break;
		case 10:
				//Gear9
		break;
		case 11:
				//Gear10
			break;
		case 12:
				//Gear11
		break;
		default:
		break;
	}

	
}

该协议已经上两个单片机验证过,没有问题。
非常感谢各位的观看!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知何人

万分感谢诸位观看

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值