参考链接
STM32 printf重定向到CAN
STM32 pritnf重定向到USB
这此来讲讲 自己怎么定义一个printf 函数 使用rs485 接口打印输出
rs485 的MCU接口本质是串口

定义rs485 的printf函数

uint8_t RS485_UserTxBuffer[512];
void RS485_Printf(const char *format, ...)
{
	va_list args;
	uint32_t length;

	va_start(args, format);
	length = vsnprintf((char *)RS485_UserTxBuffer, 512, (char *)format, args);
	va_end(args);
    
	RS485_SendStr_length(RS485_UserTxBuffer,length);
}

RS485 在收发数据的时候需要引脚切换


/*****************  发送指定长度的字符串 **********************/
void RS485_SendStr_length( uint8_t *str,uint32_t strlen )
{
	unsigned int k=0;
	RS485_TX_EN()	;//	使能发送数据
    UART_Write_Blocking( RS485_USART,(str + k), strlen);
	
	RS485_RX_EN()	;//	使能接收数据
}
#define RS485_Delay(x) wk_delay_ms(x)
/*控制收发引脚*/
//进入接收模式,必须要有延时等待485处理完数据 low
#define RS485_RX_EN()			RS485_Delay(1); gpio_bits_reset(RS485_DE_GPIO_PORT,RS485_DE_PIN);  RS485_Delay(1);
//进入发送模式,必须要有延时等待485处理完数据  high
#define RS485_TX_EN()			RS485_Delay(1); gpio_bits_set(RS485_DE_GPIO_PORT,RS485_DE_PIN);  RS485_Delay(1);

调用发送函数即可

void UART_Write_Blocking(usart_type* usart_x, uint8_t* data,uint16_t size)
{
	uint16_t i=0;
	while(usart_flag_get(usart_x, USART_TDBE_FLAG) == RESET);
	usart_flag_clear(usart_x, USART_TDBE_FLAG);
	for(i=0;i<size;i++)
	{
		usart_data_transmit(usart_x, (uint16_t)data[i]);
		while(usart_flag_get(usart_x, USART_TDC_FLAG) == RESET);
		usart_flag_clear(usart_x,USART_TDC_FLAG);
	}
}

调用函数 打印 一个数组

for(int i = 0;i<10;i++)
{
		RS485_Printf("%x",usMRegHoldBuf[0][i]);
		
}

实验效果
在这里插入图片描述注意事项 如果一直打印\0 或者0x00,那么检测硬件 收发引脚接错 。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐