////////////////////////////////////////////////////////////////////////// /// COPYRIGHT NOTICE /// Copyright (c) 2015, 传控科技 /// All rights reserved. /// /// @file main.c /// @brief main app /// ///(本文件实现的功能的详述) /// /// @version 1.1 CCsens technology /// @author CC /// @date 20150102 /// /// /// 修订说明:最初版本 /// Modified by: /// Modified date: /// Version: /// Descriptions: // 20160413 CC-ACC-VH02 // 连接至 J22 RXD0 TXD0 //P5_DIR &= ~BITN1; //p5.1输出TXD //P5_DIR |= BITN0; //p5.0输入RXD //P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD //P5_SEL1 |= BITN0 +BITN1; /***************************************************************************** update by cc @201700110 针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 个需要平衡的事情. c_lib/c_lib.c: 公用的函数 和硬件无关 放置串行模式(串口等其他通讯总线类的输出)输出的函数, 一些覆盖模式输出的(lcd等固屏输出的)的也可使用 void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) ----------------------------------------------------------------------------------------- uartcom/Uprotocol2app 协议到应用 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ L3_UARTcom0_exp_protocol 解析应用协议 ----------------------------------------------------------------------------------------- uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 公用的串口通讯定义 struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 -------------------------------------------------------------------------------------------- msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_UART0_Init UART0_IRQHandler L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ #include "uartN.h" TS_uart_reg ts_uart[SERIAL_MAX_NUM] = {0}; 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_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 ++; } } /************************ void L0_waitFree_uartN(U8 uartx) { ts_uart[uartx].p->over = 0; while(ts_uart[uartx].p->ok != D_ready) { #if 0 //发送数据特别快时,某些情况下会导致数据发送出错 if(ts_uart[uartx].p->over ++ > 600000) { break; } #endif } } void L0_uartN_sendArray(U8 uartx,void *buf,U16 len) { L0_waitFree_uartN(uartx); ts_uart[uartx].p->ok = D_clear; ts_uart[uartx].p->over = 0; ts_uart[uartx].p->max = len; ts_uart[uartx].p->now = 1; if(len <= D_send_buf_max) { //将参数buf拷贝至内部buf for(ts_uart[uartx].p->num = 0;ts_uart[uartx].p->num < len;ts_uart[uartx].p->num ++) { ts_uart[uartx].p->buf[ts_uart[uartx].p->num] = ((U8*)buf)[ts_uart[uartx].p->num]; } ts_uart[uartx].p->p = ts_uart[uartx].p->buf; } else { //不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错 ts_uart[uartx].p->p = (U8 *)buf; } L0_uartN_set(uartx,ts_uart[uartx].p->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].p->buf3[0] = uStemp.BYTE2.h; ts_uart[uartx].p->buf3[1] = uStemp.BYTE2.l; L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); } void L0_uartN_ul(U8 uartx,vU32 ww) { U_U32 uStemp; L0_waitFree_uartN(uartx); uStemp.dWord = ww; ts_uart[uartx].p->buf3[0] = uStemp.BYTE4.byte0; ts_uart[uartx].p->buf3[1] = uStemp.BYTE4.byte1; ts_uart[uartx].p->buf3[2] = uStemp.BYTE4.byte2; ts_uart[uartx].p->buf3[3] = uStemp.BYTE4.byte3; L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); } void L0_uartN_0d0a(U8 uartx) { L0_waitFree_uartN(uartx); ts_uart[uartx].p->buf3[0] = 0x0d; ts_uart[uartx].p->buf3[1] = 0x0a; L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); } void L0_uartN_uchex(U8 uartx,U8 ww) { L0_waitFree_uartN(uartx); ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(ww)][1]; ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (ww)][1]; L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); } void L0_uartN_ushex(U8 uartx,vU16 ww) { U_F16 k; L0_waitFree_uartN(uartx); k.us = ww; ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1]; ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1]; L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); } void L0_uartN_ulhex(U8 uartx,U32 ww) { U_U32 k; L0_waitFree_uartN(uartx); k.dWord = ww; ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1]; ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1]; ts_uart[uartx].p->buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; ts_uart[uartx].p->buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1]; ts_uart[uartx].p->buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; ts_uart[uartx].p->buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1]; L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,8); } void L0_uartN_sendstr(U8 uartx,U8 *str) { L0_uartN_sendArray(uartx,str,libc_strlen(str)); } void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) { int i; for(i=0;i