You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
5.0 KiB
240 lines
5.0 KiB
4 months ago
|
|
||
|
#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 ++;
|
||
|
}
|
||
|
}
|