|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
/// 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:
|
|
|
|
/*****************************************************************************
|
|
|
|
update by cc @201501101001
|
|
|
|
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是
|
|
|
|
个需要平衡的事情.
|
|
|
|
|
|
|
|
uartcom/uartlib.c:
|
|
|
|
公用的函数 和硬件无关
|
|
|
|
放置串行模式(串口等其他通讯总线类的输出)输出的函数,
|
|
|
|
一些覆盖模式输出的(lcd等固屏输出的)的也可使用
|
|
|
|
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
|
|
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
uartcom/uartcom0
|
|
|
|
和uart相关的通讯协议 com + n
|
|
|
|
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关
|
|
|
|
|
|
|
|
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------
|
|
|
|
L3_UARTcom0_exp_protocol 解析应用协议
|
|
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度
|
|
|
|
公用的串口通讯定义
|
|
|
|
struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_
|
|
|
|
void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中
|
|
|
|
--------------------------------------------------------------------------------------------
|
|
|
|
msp/uartx.c 底层代码 和cpu相关
|
|
|
|
L0_UART0_Init
|
|
|
|
UART0_IRQHandler
|
|
|
|
L0_Usend_uc----------s_at0
|
|
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
********************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "uartlib.h"
|
|
|
|
void (*L0pf_send_uc)(U8 ww);
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
*
|
|
|
|
* 名称: L0_Usend_uc_hex
|
|
|
|
* 说明: 例如:L0_Usend_uc_hex(0x0c); output " 0c "
|
|
|
|
* 功能: 发送数据
|
|
|
|
* 调用: SendHUc()Lc_HexToChar()
|
|
|
|
* 输入:
|
|
|
|
* 返回值: 无
|
|
|
|
***********************************************************************/
|
|
|
|
void Lcp_uc_hex(void (*L0pf_send_uc)(char ww),char ww)
|
|
|
|
{
|
|
|
|
L0pf_send_uc(Lc_Hex2Char((ww>>4)&0x0f));
|
|
|
|
L0pf_send_uc(Lc_Hex2Char(ww&0x0f));
|
|
|
|
}
|
|
|
|
|
|
|
|
void Lcp_us_hex(void (*L0pf_send_uc)(char ww),U16 ww)
|
|
|
|
{//
|
|
|
|
U8 t;
|
|
|
|
t = (U8)(((ww >> 8)&0x00ff));
|
|
|
|
Lcp_uc_hex(L0pf_send_uc,t);
|
|
|
|
t = (U8)(((ww )&0x00ff));
|
|
|
|
Lcp_uc_hex(L0pf_send_uc,t);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Lc_print(char *dat,...)
|
|
|
|
{
|
|
|
|
const char *s;
|
|
|
|
vS32 d;
|
|
|
|
char buf[16];
|
|
|
|
|
|
|
|
va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针,
|
|
|
|
//取参必须通过这个指针进行。
|
|
|
|
//<Step 1> 在调用参数表之前,定义一个 va_list 类型的变量,
|
|
|
|
//(假设va_list 类型变量被定义为ap);
|
|
|
|
va_start(ap, dat);
|
|
|
|
// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数,
|
|
|
|
//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在
|
|
|
|
//变参表前面紧挨着的一个变量,即“...”之前的那个参数;
|
|
|
|
|
|
|
|
// <Step 3> 然后是获取参数,调用va_arg,它的第一个参数是ap,
|
|
|
|
//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,
|
|
|
|
//并且把 ap 的位置指向变参表的下一个变量位置;
|
|
|
|
//"e645654675y73\0"
|
|
|
|
while ( *dat != 0) // 判断是否到达字符串结束符
|
|
|
|
{
|
|
|
|
if ( *dat == 0x5c ) //'\'
|
|
|
|
{
|
|
|
|
switch ( *++dat )
|
|
|
|
{
|
|
|
|
case 'r': //回车符
|
|
|
|
L0pf_send_uc(0x0d);
|
|
|
|
dat ++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'n': //换行符
|
|
|
|
L0pf_send_uc(0x0a);
|
|
|
|
dat ++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 't': //
|
|
|
|
L0pf_send_uc(0x09);
|
|
|
|
dat ++;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
dat ++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( *dat == '%')
|
|
|
|
{ //
|
|
|
|
switch ( *++dat )
|
|
|
|
{
|
|
|
|
case 'C':
|
|
|
|
case 'c': //字符
|
|
|
|
//va_arg()里的任务就是根据指定的参数类型
|
|
|
|
//取得本参数的值,并且把指针调到下一
|
|
|
|
//个参数的起始地址
|
|
|
|
//#define va_arg(ap,t)
|
|
|
|
//( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
|
|
|
|
|
|
|
|
//char *ap; %c " , 0x30,
|
|
|
|
s = va_arg(ap, const char *); // 0x30
|
|
|
|
L0pf_send_uc((char)s); // '0'
|
|
|
|
dat++;
|
|
|
|
break;
|
|
|
|
case 'd': //十进制
|
|
|
|
//" %d",0x30,
|
|
|
|
//" %d",48,
|
|
|
|
// int i = 48;
|
|
|
|
//" %d",i,
|
|
|
|
|
|
|
|
d = va_arg(ap, int); // 0x30 =48d
|
|
|
|
Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8'
|
|
|
|
for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s
|
|
|
|
{ //\0
|
|
|
|
L0pf_send_uc(*s);
|
|
|
|
//printf("%c",*s);
|
|
|
|
}
|
|
|
|
dat++;
|
|
|
|
break;
|
|
|
|
case 'X':
|
|
|
|
case 'x': //字符串
|
|
|
|
d = va_arg(ap, int); // 0x30 =48d
|
|
|
|
dat++;//%X2 %X4 %X8
|
|
|
|
Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8'
|
|
|
|
for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s
|
|
|
|
{ //\0
|
|
|
|
L0pf_send_uc(*s);
|
|
|
|
}
|
|
|
|
dat++;
|
|
|
|
break;
|
|
|
|
case 'S':
|
|
|
|
case 's': //字符串
|
|
|
|
s = va_arg(ap, const char *);
|
|
|
|
for ( ; *s; s++)
|
|
|
|
{
|
|
|
|
L0pf_send_uc(*s);
|
|
|
|
}
|
|
|
|
dat++;
|
|
|
|
break;
|
|
|
|
case 'f': //十进制
|
|
|
|
d = va_arg(ap, int);
|
|
|
|
Lc_int2a(d, buf, 10);
|
|
|
|
for (s = buf; *s; s++)
|
|
|
|
{
|
|
|
|
L0pf_send_uc(*s);
|
|
|
|
|
|
|
|
}
|
|
|
|
dat++;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
dat++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} /* end of else if */
|
|
|
|
else
|
|
|
|
{
|
|
|
|
L0pf_send_uc( *dat++);
|
|
|
|
}
|
|
|
|
}//end while....
|
|
|
|
}//
|
|
|
|
|