平车主控板(运维板)
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.
 
 
 
 
 

198 lines
5.8 KiB

//////////////////////////////////////////////////////////////////////////
/// 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....
}//