Usart 串口发送数据包 两种方式(遍历结构体,指针数组)

Usart 串口发送数据包 两种方式(结构体,指针数组)

1.结构体指针

1.1 结构体和联合体

/*
	叙述:这种直观性比较,利用联合体和结构体的形式组成数据包,通过结构体指针发送
*/
typedef union{
	struct
	{
		unsigned char id;
		unsigned char addr;
		unsigned char head; 
		unsigned char left_time; 		
		unsigned char left_hour; 				
		unsigned char right_time; 		
		unsigned char right_hour; 						 
		unsigned char key_high; 						  
		unsigned char key_low; 						  	 
		unsigned char sofa_left; 						  
		unsigned char sofa_right; 						  	 
		unsigned char funtion_dis; 						  	 
		unsigned char checksum;
		unsigned char stop;
	}led_sta;
	unsigned char tx_buf[BUF_SIZE];
}
DATA_FORMAT_TX;

void   send_buf(DATA_FORMAT_TX *buf) {
	unsigned char i;	
	for(i =  0 ; i <14;i++ ){
			printf("%c", buf->tx_buf[i]); 			
	}			
}

void send_buf_packet(void){	
	DATA_FORMAT_TX buf;
	buf.led_sta.id 	   			=0x05;
	buf.led_sta.addr  			=0x03 ;
	buf.led_sta.head  			=0xE1 ; 
	buf.led_sta.left_time 		= 0 ; 		
	buf.led_sta.left_hour 		= 1 ; 				
	buf.led_sta.right_time 		= 2 ; 		
	buf.led_sta.right_hour 		= 3 ; 						 
	buf.led_sta.key_high 	 	= 4 ; 						 
	buf.led_sta.key_low    		= 5 ; 						 
	buf.led_sta.sofa_left		= 6 ; 						 
	buf.led_sta.sofa_right 		= 7 ; 						 
	buf.led_sta.funtion_dis		= 8 ; 						 
	buf.led_sta.checksum		= 0XAA;
	buf.led_sta.stop 			= 0XFB;		
	send_buf(&buf);
}

1.2 纯结构发送的形式

/*
	叙述:这种跟前面一种较为相似, 直接操作结构体
*/

void send_buf_packet(void) {
	DATA_FORMAT_TX  send_dat,*p  = &send_dat ;  // 定义一个结构,把地址传给指针
	unsigned char *pstu,i,len;
	p->id 	   				= 0x05;
	p->addr  				= 0x03 ;
	p->head  				= 0xE1 ; 
	p->left_time 			= 0 ; 		
	p->left_hour 			= 1 ; 				
	p->right_time 			= 2 ; 		
	p->right_hour 			= 3 ; 						 
	p->key_high 	 		= 4 ; 						 
	p->key_low    			= 5 ; 						 
	p->sofa_left			= 6 ; 						 
	p->sofa_right 			= 7 ; 						 
	p->funtion_dis			= 8 ; 						 
	p->checksum				= 0XAA;
	p->stop 				= 0XFB;
	pstu = (unsigned char *)&send_dat;  // 强制转换地址,前提结构一种类型(unsigned char)
	len = sizeof(send_dat);   		   //  计算结构体的长度
	for(i =  0 ; i <len;i++ ){		  
			printf("%c",*pstu++);     // 输出遍历结构元素
	}
}

2.指针数组形式

/*
	这种比较简单暴力直观明了,利用指针数组的形式传递数据
*/

void  send_buf_packet(void)
{
	unsigned char *p, arr[10] = {0,1,2,3,4,5,6,7,8,9};
	for(p = &arr[0]; p < &arr[10];){   //把地址的位置值取出来				
		printf("%c",*p); 			 //打印数据
		*p++;						//指向地址
	}	
}
  • 3
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在STM32中,USART的中断方式使用结构体进行配置,该结构体USART_InitTypeDef,定义在stm32fxxx_hal_uart.h头文件中,结构体成员如下: ```c typedef struct { uint32_t BaudRate; /*!< This member configures the USART communication baud rate. The baud rate is computed using the following formula: - IntegerDivider = ((PCLKx) / (16 * (huart->Init.BaudRate))) - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 16) + 0.5 Where PCLKx is the peripheral clock (Hz) (coming from RCC peripheral clocks). */ uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. This parameter can be a value of @ref USART_Word_Length */ uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. This parameter can be a value of @ref USART_Stop_Bits */ uint32_t Parity; /*!< Specifies the parity mode. This parameter can be a value of @ref USART_Parity */ uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. This parameter can be a value of @ref USART_Mode */ uint32_t HwFlowCtl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. This parameter can be a value of @ref USART_Hardware_Flow_Control */ uint32_t OverSampling; /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to fPCLK/8). This parameter can be a value of @ref USART_Over_Sampling */ } USART_InitTypeDef; ``` 其中,各个成员的含义如下: - BaudRate:波特率; - WordLength:数据位长度,可以是8位或9位; - StopBits:停止位长度,可以是1位或2位; - Parity:校验位模式,可以是无校验,偶校验或奇校验; - Mode:收发模式,可以是只收、只发或收发都支持; - HwFlowCtl:硬件流控制模式,可以是无硬件流控制、CTS流控制、RTS流控制或CTS/RTS流控制; - OverSampling:采样率,可以是16或8。 使用该结构体进行USART的中断方式配置,可以通过HAL库提供的USART_Init函数实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mg_hover

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值