打印

如何让RS485实现打印输出功能

[复制链接]
1097|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、基于RS232的串口重映射
       RS232是全双工的,基于RS232的串口重映射实现就很简单,官方例程有提供,不再赘述;
int fputc(int ch,FILE *p)
{
        usart_data_transmit(USART0,(u8)ch);
        while(!usart_flag_get(USART0,USART_FLAG_TBE));
        return ch;
}


二、基于RS485的串口打印输出
      大部分的RS485芯片支持半双工通讯模式,与RS232的全双工不同多了一个收发控制,同一时刻最多只能处于收发模式中的一种,
利用编译器下的库实现,包含头文件如图,,因为需要用到va_list 类和“vsnprintf()”函数,需要将“stdarg.h”等头文件添加


三、程序
(1)、串口初始化
void USART1_Init(u32 bound)
{
        //时钟设置
        rcu_periph_clock_enable(RCU_GPIOA);       
    rcu_periph_clock_enable(RCU_USART1);

        //USARTx_TX
        gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);

        //USARTx_RX
        gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_3);  
       
        #if RS485_USART1==1
        gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1);
        RS485_USART1_TX_EN=0;
        #endif
       
        //NVIC 配置
        nvic_irq_enable(USART1_IRQn,0,2);         
       
         //USARTx初始化
        usart_baudrate_set(USART1,bound);
    usart_parity_config(USART1,USART_PM_NONE);
    usart_word_length_set(USART1,USART_WL_8BIT);
    usart_stop_bit_set(USART1,USART_STB_1BIT);
    usart_transmit_config(USART1,USART_TRANSMIT_ENABLE);
    usart_receive_config(USART1,USART_RECEIVE_ENABLE);
    usart_hardware_flow_rts_config(USART1,USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART1,USART_CTS_DISABLE);
   
        //使能配置
       
        usart_interrupt_enable(USART1,USART_INT_RBNE);
        usart_interrupt_enable(USART1,USART_INT_IDLE);//开启串口空闲IDEL中断
        usart_enable(USART1);                    //使能串口
        USART1_printf("USART1 OK...\r\n");
}
(2)、RS485打印函数
void USART1_printf (char *fmt, ...)
{
        u16 i = 0;
        va_list arg_ptr;
        va_start(arg_ptr, fmt);  
        vsnprintf((char *)USART1_TX_BUF, USART1_MAX_TX_LEN+1, fmt, arg_ptr);
        va_end(arg_ptr);
       
        #if RS485_USART1==1
        RS485_USART1_TX_EN=1;
        #endif
       
        while ((i < USART1_MAX_TX_LEN) && USART1_TX_BUF[i])
        {
                while (usart_flag_get(USART1, USART_FLAG_TBE) == RESET);
                usart_data_transmit(USART1, (u8) USART1_TX_BUF[i++]);
                while (usart_flag_get(USART1, USART_FLAG_TC)  == RESET);
        }
       
        #if RS485_USART1==1
        RS485_USART1_TX_EN=0;
        #endif
}
(3)主函数
int main(void)
{
    sysdelay_set(96);
    led_set();
    USART1_Init(9600);
    while (1)
        {
        led_on(5);
        delay_nms(500);
        USART1_printf("led on\r\n");
        led_off(5);
        delay_nms(500);
        USART1_printf("led off\r\n");
    }
}


四、验证结果


使用特权

评论回复
沙发
aoyi| | 2020-7-6 16:13 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
板凳
drer| | 2020-7-6 16:16 | 只看该作者
代码很全啊

使用特权

评论回复
地板
gwsan| | 2020-7-6 16:16 | 只看该作者
楼主辛苦了

使用特权

评论回复
5
kxsi| | 2020-7-6 16:16 | 只看该作者
正好可以拿来用

使用特权

评论回复
6
nawu| | 2020-7-6 16:17 | 只看该作者
感谢分享代码哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

1980

帖子

15

粉丝