【AT32】AT32 重定向printf 到 RS485
·
参考链接
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,那么检测硬件 收发引脚接错 。
更多推荐



所有评论(0)