#include "uart0.h" #include "uartx.h" void L0_uart0_init(void) { U16 val = D_BRT_COUNT(12, D_sys_MainFre, D_uart0_BRT); SCON = 0x50; // 8位数据,可变波特率 AUXR &= 0xBF; //定时器时钟12T模式 AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设置定时器模式 TL1 = val; //设置定时初始值 TH1 = val >> 8; //设置定时初始值 ET1 = 0; //禁止定时器中断 TR1 = 1; //定时器1开始计时 } void L0_uart0_buf_init(void) { //定义发送缓冲区 ts_uart[uNum0].s.buf = ts_send_buf.s1; ts_uart[uNum0].s.bufmax = D_send1_max; ts_uart[uNum0].s.max = ts_uart[uNum0].s.now = 0; ts_uart[uNum0].s.ok = D_ready; //定义接收缓冲区 ts_uart[uNum0].r.buf = ts_recv_buf.r1; ts_uart[uNum0].r.bufmax = D_recv1_max; ts_uart[uNum0].r.head = 0; ts_uart[uNum0].r.ok = 0; ts_uart[uNum0].r.idle = 1; ts_uart[uNum0].r.overtime_t = 0; //定义接收处理协议 ts_uart[uNum0].tp_handler = L0_uartN_overtime_callback; ts_uart[uNum0].uartx = uNum0; //串口初始化 L0_uart0_init(); //打开串口中断 D_uart0_ES_INT(1); //默认处于接收状态 // D_UART0_485_RX() } /************************************************* UART 中断 *************************************************/ void INTERRUPT_UART(void) D_SERVE_UART { // NOP(); NOP(); NOP(); if (L0_uart0_IntRI()) //如果是U0接收中断 { L0_uart0_IntRIClear(); //清除接收中断标志 ts_uart[uNum0].r.reg = SBUF; //获取当前数据 L0_uartN_s2b(uNum0); //接收数据至缓冲区 } if (L0_uart0_IntTI()) //如果是U0发送中断 { L0_uart0_IntTIClear(); //清除发送中断标志 if (ts_uart[uNum0].s.max > ts_uart[uNum0].s.now) { SBUF = ts_uart[uNum0].s.p[ts_uart[uNum0].s.now]; ts_uart[uNum0].s.now++; } else { ts_uart[uNum0].s.ok = D_ready; ts_uart[uNum0].s.max = 0; ts_uart[uNum0].s.now = 0; //可以发送下一个数据 // D_UART0_485_RX() //切换到接收状态 } } // NOP(); NOP(); NOP(); }