#include "uartx.h" TS_uart_reg ts_uart[SERIAL_MAX_NUM] = {0}; TS_send_buf ts_send_buf; TS_recv_buf ts_recv_buf; void L0_uartN_set(U8 uartx, U8 x) /*reentrant*/ { switch (uartx) { case 0: SBUF = (x); break; case 1: S2BUF = (x); break; case 2: S3BUF = (x); break; case 3: S4BUF = (x); break; default: break; } } U8 L0_uartN_get(U8 uartx) { U8 x = 0; switch (uartx) { case 0: x = SBUF; break; case 1: x = S2BUF; break; case 2: x = S3BUF; break; case 3: x = S4BUF; break; default: break; } return x; } void L0_uartN_485(U8 uartx) { switch(uartx) { // case 0: D_UART0_485_TX(); break; // case 1: D_UART2_485_TX(); break; // case 2: D_UART3_485_TX(); break; // case 3: D_UART4_485_TX(); break; default: break; } } void L0_waitFree_uartN(U8 uartx) { ts_uart[uartx].s.over = 0; while (ts_uart[uartx].s.ok != D_ready) { #if 1 //发送数据特别快时,某些情况下会导致数据发送出错 ts_uart[uartx].s.over++; if (ts_uart[uartx].s.over > 20000) { ts_uart[uartx].s.max = 0; ts_uart[uartx].s.now = 0; ts_uart[uartx].s.ok = D_ready; break; } #endif } } void L0_uartN_sendArray(U8 uartx, void *buf, U16 len) { U16 i; if (len == 0) { return; } L0_waitFree_uartN(uartx); L0_uartN_485(uartx); ts_uart[uartx].s.ok = D_clear; ts_uart[uartx].s.over = 0; ts_uart[uartx].s.max = len; ts_uart[uartx].s.now = 1; if (len <= ts_uart[uartx].s.bufmax) { //将参数buf拷贝至内部buf for (i = 0; i < len; i++) { ts_uart[uartx].s.buf[i] = ((U8 *)buf)[i]; } ts_uart[uartx].s.p = ts_uart[uartx].s.buf; } else { //不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错 ts_uart[uartx].s.p = (U8 *)buf; } L0_uartN_set(uartx, ts_uart[uartx].s.p[0]); } void L0_uartN_uc(U8 uartx, U8 ww) { L0_uartN_sendArray(uartx, &ww, 1); } void L0_uartN_us(U8 uartx, vU16 ww) { U_U16 uStemp; uStemp.word = ww; ts_uart[uartx].s.buf3[0] = uStemp.BYTE2.h; ts_uart[uartx].s.buf3[1] = uStemp.BYTE2.l; L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2); } void L0_uartN_ul(U8 uartx, vU32 ww) { U_U32 uStemp; L0_waitFree_uartN(uartx); uStemp.dWord = ww; ts_uart[uartx].s.buf3[0] = uStemp.BYTE4.byte0; ts_uart[uartx].s.buf3[1] = uStemp.BYTE4.byte1; ts_uart[uartx].s.buf3[2] = uStemp.BYTE4.byte2; ts_uart[uartx].s.buf3[3] = uStemp.BYTE4.byte3; L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 4); } void L0_uartN_0d0a(U8 uartx) { L0_waitFree_uartN(uartx); ts_uart[uartx].s.buf3[0] = 0x0d; ts_uart[uartx].s.buf3[1] = 0x0a; L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2); } void L0_uartN_uchex(U8 uartx, U8 ww) { L0_waitFree_uartN(uartx); ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(ww)][1]; ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(ww)][1]; L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2); } void L0_uartN_ushex(U8 uartx, vU16 ww) { U_F16 k; L0_waitFree_uartN(uartx); k.us = ww; ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(k.BYTE2.H)][1]; ts_uart[uartx].s.buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; ts_uart[uartx].s.buf3[3] = cguHex2Char[D_uc_low(k.BYTE2.L)][1]; L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 4); } void L0_uartN_ulhex(U8 uartx, U32 ww) { U_U32 k; L0_waitFree_uartN(uartx); k.dWord = ww; ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(k.BYTE4.byte0)][1]; ts_uart[uartx].s.buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; ts_uart[uartx].s.buf3[3] = cguHex2Char[D_uc_low(k.BYTE4.byte1)][1]; ts_uart[uartx].s.buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; ts_uart[uartx].s.buf3[5] = cguHex2Char[D_uc_low(k.BYTE4.byte2)][1]; ts_uart[uartx].s.buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; ts_uart[uartx].s.buf3[7] = cguHex2Char[D_uc_low(k.BYTE4.byte3)][1]; L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 8); } void L0_uartN_sendstr(U8 uartx, U8 *str) { L0_uartN_sendArray(uartx, str, Lc_strlen(str)); } void L0_uartN_sendArrayHex(U8 uartx, vU8 *buf, U16 n) { U16 i; for (i = 0; i < n; i++) { L0_uartN_uchex(uartx, buf[i]); L0_uartN_uc(uartx, ' '); } } void L0_uartN_s2b(U8 uartx) { if(ts_uart[uartx].r.head == 0) { ts_uart[uartx].r.head = 1; ts_uart[uartx].r.ok = 0; ts_uart[uartx].r.num = 0; } else { if(ts_uart[uartx].r.num >= ts_uart[uartx].r.bufmax) { ts_uart[uartx].r.num = 0; } } ts_uart[uartx].r.buf[ ts_uart[uartx].r.num ] = ts_uart[uartx].r.reg; ts_uart[uartx].r.num++; ts_uart[uartx].r.idle = 0; ts_uart[uartx].r.overtime_t = 0; } void L0_uartN_overtime_callback(U8 uartx) { if(0 == ts_uart[uartx].r.idle) { if(ts_uart[uartx].r.overtime_t >= 2) { //设置总线空闲 ts_uart[uartx].r.idle = 1; ts_uart[uartx].r.head = 0; ts_uart[uartx].r.overtime_t = 0; //数据不为空 if(ts_uart[uartx].r.num > 0) { /// 接收到的数据结束: 总线空闲+buf非空 // ts_uart[uartx].r.num = 0; ts_uart[uartx].r.ok = 1; } } ts_uart[uartx].r.overtime_t ++; } }