diff --git a/source/.vscode/settings.json b/source/.vscode/settings.json index 66f1fe3..72336ed 100644 --- a/source/.vscode/settings.json +++ b/source/.vscode/settings.json @@ -7,6 +7,9 @@ "main.h": "c", "bsp_config_delay.h": "c", "bsp_key.h": "c", - "stc_macro.H": "cpp" + "stc_macro.H": "cpp", + "uart_x.h": "c", + "UART4.C": "cpp", + "tpc_x.h": "c" } } \ No newline at end of file diff --git a/source/app/main.c b/source/app/main.c index 6d2a251..422d9ff 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -133,18 +133,27 @@ void main(void) if(1 == s_nos_tick.t1s_heatbeart) { s_nos_tick.t1s_heatbeart = 0; - LED0 ^= 1; + //LED0 ^= 1; // KR1 ^= 1; // KC1 ^= 1; - L0_uart0_uc('.'); + //L0_uart0_uc('.'); // L0_uart0_sendArray("v2.7",4); - // L0_uartN_sendstr(0,"v2.8111"); + //L0_uartN_sendstr(0,"v2.8111"); } + //扫描键盘 key = bsp_key_scan(); if(key != BSP_KEY_NUM_MAX){ L0_uart0_uchex(key); } + + //串口调试 + if(ts_uart0_recv_buf.ok == 1){ + NOP(10); + ts_uart0_recv_buf.ok = 0; + L0_uart0_uc(ts_uart0_recv_buf.reg); + } + //L1_ADS1213_main(); diff --git a/source/app/task_debug.c b/source/app/task_debug.c index 9380cda..e98d23c 100644 --- a/source/app/task_debug.c +++ b/source/app/task_debug.c @@ -39,8 +39,8 @@ void L3_task_debug(S_TASK_DEBUG *s) L0_uart0_uc(' '); L0_uart0_ulhex(R.adval[3]); L0_uart0_uc(' ');*/ - L0_uart0_ulhex(R.total_weight); - L0_uart0_0d0a(); + // L0_uart0_ulhex(R.total_weight); + // L0_uart0_0d0a(); L2_task_go_Tdelay(D_task_ADC_CHx_DEBUG,D_Tdelay_Msec(15)); //延时15ms TTSS_Task_end(); diff --git a/source/app/task_modbus.c b/source/app/task_modbus.c index 0549bc3..794a783 100644 --- a/source/app/task_modbus.c +++ b/source/app/task_modbus.c @@ -177,20 +177,20 @@ void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_in } -void L3_task_modbus_handler(TP_Handler_X *ph4) +void L3_task_modbus_handler(Ts_uart_recv_buf *ph4) { - if(ph4->ok) - { - TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; - //L0_uart0_sendArray(ph4->buf, 8); - //L0_uart0_sendArray("abcdefgh", 8); - ph4->ok = 0; - if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART4_485_SLAVER_ID_BROADCAST) //从机 - { - U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack); - L0_uart0_sendArray((U8*)&s_uart0_ack, acklen); - } - } + // if(ph4->ok) + // { + // TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; + // //L0_uart0_sendArray(ph4->buf, 8); + // //L0_uart0_sendArray("abcdefgh", 8); + // ph4->ok = 0; + // if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART4_485_SLAVER_ID_BROADCAST) //从机 + // { + // U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack); + // L0_uart0_sendArray((U8*)&s_uart0_ack, acklen); + // } + // } } diff --git a/source/app/task_modbus.h b/source/app/task_modbus.h index 98b32ef..eef9d46 100644 --- a/source/app/task_modbus.h +++ b/source/app/task_modbus.h @@ -4,6 +4,6 @@ #include "../ctask/task.h" #include "../tpc/modbus.h" -extern void L3_task_modbus_handler(TP_Handler_X *ph4); +extern void L3_task_modbus_handler(Ts_uart_recv_buf *ph4); #endif diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h index 2cc4c44..08d3757 100644 --- a/source/bsp/bsp_config.h +++ b/source/bsp/bsp_config.h @@ -228,12 +228,12 @@ //STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<volume_change --; s->volume_temp = s->volume; - s->volume = s->volume_change*s->volume_shop/20;// + s->volume = s->volume_change*s->volume_buf/20;// if (s->volume_temp != s->volume) { s->sector = D_voice_volume|s->volume; diff --git a/source/msp/UART0.C b/source/msp/UART0.C index 52ad6a6..04d2091 100644 --- a/source/msp/UART0.C +++ b/source/msp/UART0.C @@ -56,39 +56,48 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 ********************************************************************************/ #include "uart0.h" #include "../msp/time.h" -//#define _USE_485 +#include "../tpc/debug.h" -static volatile Ts_uart_send_buf idata ts_uart_send_shop; +int g_uart0_recv_num = 0; -TP_Handler_X s_uart0_rec; -TS_PH4_modbus s_uart0_ack; +//发送缓冲区 +static volatile Ts_uart_send_buf idata ts_uart_send_buf; +//接收缓冲区最多存放16个字符,这个值尽量小,但要大于实际处理协议的缓冲区大小 +U8 uart0_recv_buf[16]; +Ts_uart_recv_buf ts_uart0_recv_buf; void L0_uart0_init(void) { U16 val = D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT); SCON = 0x50; //8位数据,可变波特率 - AUXR |= 0x01; //串口1选择定时器2为波特率发生器 - AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T - //T2L = 0xFE; //设定定时初值 - //T2H = 0xFF; //设定定时初值 - T2L = val; - T2H = val >> 8; - AUXR |= 0x10; //启动定时器2 + AUXR &= 0xBF; //定时器时钟12T模式 + AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 + TMOD &= 0x0F; //设置定时器模式 + TL1 = val; //设置定时初始值 + TH1 = val >> 8; //设置定时初始值 + ET1 = 0; //禁止定时器中断 + TR1 = 1; //定时器1开始计时 } void L0_uart0_buf_init(void) { - ts_uart[uNum0].p = &ts_uart_send_shop; + //定义发送缓冲区 + ts_uart[uNum0].p = &ts_uart_send_buf; ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0; ts_uart[uNum0].p->ok = D_ready; - ts_uart[uNum0].t = &s_uart0_rec; + + //定义接收缓冲区 + ts_uart[uNum0].t = &ts_uart0_recv_buf; + ts_uart[uNum0].t->buf = uart0_recv_buf; ts_uart[uNum0].t->head = 0; ts_uart[uNum0].t->ok = 0; - //ts_uart[uNum0].tp_handler = L1_s2b_PH4; - ts_uart[uNum0].tp_handler = NULL; //使用函数指针导致错误 - ts_uart[uNum0].ack = (U8*)&s_uart0_ack; + + //定义接收处理协议 + ts_uart[uNum0].tp_handler = L1_s2b_debug; //使用函数指针导致错误 + + //串口定时器及中断初始化 L0_uart0_init(); - D_uart0_ES_INT(1); //打开串口中断 + D_uart0_ES_INT(1); #if (D_UART0_485_TYPE != TYPE_485_NONE) D_UART0_485_RX() //默认处于接收状态 @@ -113,9 +122,10 @@ void INTERRUPT_UART(void) D_SERVE_UART { L0_uart0_IntRIClear(); //清除接收中断标志 ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); - //ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); - L1_s2b_PH4(ts_uart[uNum0].t); - //L0_timer1_restart(); + if(ts_uart[uNum0].tp_handler != NULL){ + g_uart0_recv_num++; + ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); + } } if(L0_uart0_IntTI()) //如果是U0发送中断 { @@ -138,23 +148,5 @@ void INTERRUPT_UART(void) D_SERVE_UART //NOP(); NOP(); NOP(); } -void timer1_isrHanddle(void) D_SERVE_TIMER1 -{ - struct _tp_handler_x *p = &s_uart0_rec; - - if((p->head == 1) && (p->num >= D_s_modbus_min)) - { - //LED1 ^= 1; - p->head = 0; - crc16(p->crc,p->buf,p->num - 2); //校验CRC - if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) - { - p->ok = 1; - //LED0 ^= 1; - } - } - L0_timer1_stop(); -} - diff --git a/source/msp/UART0.h b/source/msp/UART0.h index 37bd779..d9b3620 100644 --- a/source/msp/UART0.h +++ b/source/msp/UART0.h @@ -81,8 +81,8 @@ void L0_uart0_sendArray(U8 * buf, U16 len); #define L0_uart0_sendstr(buf) L0_uartN_sendstr(uNum0,buf) #define L1_uart0_uchexArray(buf) L1_uartN_uchexArray(uNum0,buf) -extern TP_Handler_X s_uart0_rec; -extern TS_PH4_modbus s_uart0_ack; +extern Ts_uart_recv_buf ts_uart0_recv_buf; +extern int g_uart0_recv_num; #endif //#ifndef _uart0_H diff --git a/source/msp/UART2.c b/source/msp/UART2.c index 3884af7..4c7f0ee 100644 --- a/source/msp/UART2.c +++ b/source/msp/UART2.c @@ -57,11 +57,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "uart2.h" #include "../app/common.h" -//#define _USE_485 - -static volatile Ts_uart_send_buf idata ts_uart_send_shop; -TP_Handler_X s_uart2_rec; -TS_PH3_ccmodbus s_uart2_ack; +//发送缓冲区 +static volatile Ts_uart_send_buf idata ts_uart_send_buf; +//接收缓冲区最多存放16个字符,这个值尽量小,但要大于实际处理协议的缓冲区大小 +static U8 uart2_recv_buf[16]; +Ts_uart_recv_buf ts_uart2_recv_buf; void L0_uart2_init(void) { @@ -83,16 +83,16 @@ void L0_uart2_init(void) void L0_uart2_buf_init(void) { - ts_uart[uNum2].p = &ts_uart_send_shop; + ts_uart[uNum2].p = &ts_uart_send_buf; ts_uart[uNum2].p->now = 0; ts_uart[uNum2].p->ok = D_ready; - ts_uart[uNum2].t = &s_uart2_rec; + ts_uart[uNum2].t = &ts_uart_recv_buf; + ts_uart[uNum2].t->buf = uart2_recv_buf; ts_uart[uNum2].t->head_0 = D_CMD_Filter1_ff; ts_uart[uNum2].t->head_1 = D_CMD_Filter2_fe; ts_uart[uNum2].t->head = 0; ts_uart[uNum2].t->ok = 0; ts_uart[uNum2].tp_handler = L1_s2b_PH3; - ts_uart[uNum2].ack = (U8*)&s_uart2_ack; L0_uart2_init(); D_uart2_ES_INT(1); //打开串口中断 @@ -120,7 +120,7 @@ void INTERRUPT_uart2(void) D_SERVE_uart2// using 2 { L0_uart2_IntRIClear(); //清除接收中断标志 ts_uart[uNum2].t->reg = L0_uartN_get(uNum2); - ts_uart[uNum2].tp_handler(ts_uart[uNum2].t); + ts_uart[uNum2].tp_handler(ts_uart[uNum2].t)); } if(L0_uart2_IntTI()) //如果是U0发送中断 { diff --git a/source/msp/UART2.h b/source/msp/UART2.h index 8d2835b..b916b67 100644 --- a/source/msp/UART2.h +++ b/source/msp/UART2.h @@ -79,8 +79,7 @@ void L0_uart2_sendArray(U8 * buf, U16 len); #define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X) #define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf) -extern TP_Handler_X s_uart2_rec; -extern TS_PH3_ccmodbus s_uart2_ack; +extern Ts_uart_recv_buf ts_uart2_recv_buf; #endif //#ifndef _uart2_H diff --git a/source/msp/UART3.c b/source/msp/UART3.c index 5c59ccb..7b784f9 100644 --- a/source/msp/UART3.c +++ b/source/msp/UART3.c @@ -58,9 +58,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "time.h" #include -static volatile Ts_uart_send_buf idata ts_uart_send_shop; -struct _tp_handler_x s_uart3_rec; -TS_PH4_modbus s_uart3_ack; +//发送缓冲区 +static volatile Ts_uart_send_buf idata ts_uart_send_buf; +//接收缓冲区最多存放16个字符,这个值尽量小,但要大于实际处理协议的缓冲区大小 +static U8 uart3_recv_buf[16]; +Ts_uart_recv_buf ts_uart3_recv_buf; void L0_uart3_init(void) { @@ -85,16 +87,15 @@ void L0_uart3_init(void) void L0_uart3_buf_init(void) { - ts_uart[uNum3].p = &ts_uart_send_shop; + ts_uart[uNum3].p = &ts_uart_send_buf; ts_uart[uNum3].p->now = 0; ts_uart[uNum3].p->ok = D_ready; - ts_uart[uNum3].t = &s_uart3_rec; + ts_uart[uNum3].t = &ts_uart3_recv_buf; + ts_uart[uNum3].t->buf = uart3_recv_buf; ts_uart[uNum3].t->head = 0; ts_uart[uNum3].t->ok = 0; - ts_uart[uNum3].tp_handler = L1_s2b_PH4; - ts_uart[uNum3].ack = (U8*)&s_uart3_ack; + ts_uart[uNum3].tp_handler = L1_s2b_PH1; L0_uart3_init(); - //D_uart3_ES_INT_OPEN(); //打开串口中断 D_uart3_ES_INT(1); //打开串口中断 #if (D_UART3_485_TYPE != TYPE_485_NONE) @@ -122,7 +123,6 @@ void INTERRUPT_UART3(void) D_SERVE_UART3// using 3 L0_uart3_IntRIClear(); //清除接收中断标志 ts_uart[uNum3].t->reg = L0_uartN_get(uNum3); ts_uart[uNum3].tp_handler(ts_uart[uNum3].t); - //L0_timer4_start(0); } if(L0_uart3_IntTI()) { @@ -148,23 +148,4 @@ void INTERRUPT_UART3(void) D_SERVE_UART3// using 3 NOP(); NOP(); NOP(); } -void timer4_isrHanddle(void) D_SERVE_TIMER4 -{ - struct _tp_handler_x *p = &s_uart3_rec; - if((p->head == 1) && (p->num >= D_s_modbus_min)) - { - p->head = 0; - crc16_irq(p->crc,p->buf,p->num - 2); //校验CRC - if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) - { - if(p->ok == 0) - { - p->ok = 1; - } - } - LED0 ^= 1; - } - L0_timer4_stop(); -} - diff --git a/source/msp/UART3.h b/source/msp/UART3.h index a4e2ea8..ce6c064 100644 --- a/source/msp/UART3.h +++ b/source/msp/UART3.h @@ -55,6 +55,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../bsp/bsp_config.h" #include "../tpc/tpc_modbus.h" +#include "../tpc/tpc_modbus.h" #include "uartN.h" #define uNum3 2 @@ -86,8 +87,7 @@ void L0_uart3_sendArray(U8 * buf, U16 len); #define L0_uart3_sendstr(buf) L0_uartN_sendstr(uNum3,buf) #define L1_uart3_uchexArray(buf) L1_uartN_uchexArray(uNum3,buf) -extern TP_Handler_X s_uart3_rec; -extern TS_PH4_modbus s_uart3_ack; +extern Ts_uart_recv_buf ts_uart3_recv_buf; #endif //#ifndef _uart3_H diff --git a/source/msp/UART4.C b/source/msp/UART4.C index 9184f55..61ff1b8 100644 --- a/source/msp/UART4.C +++ b/source/msp/UART4.C @@ -56,13 +56,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 ********************************************************************************/ #include "uart4.h" -//#define _USE_485 - -static volatile Ts_uart_send_buf idata ts_uart_send_shop; -//TP_Handler_X s_uart4_at_rec; -//TP_Handler_X s_uart4_tcp_rec; -TP_Handler_X s_uart4_rec; -TS_PH3_ccmodbus s_uart4_ack; +//发送缓冲区 +static volatile Ts_uart_send_buf idata ts_uart_send_buf; +//接收缓冲区最多存放16个字符,这个值尽量小,但要大于实际处理协议的缓冲区大小 +static U8 uart4_recv_buf[16]; +Ts_uart_recv_buf ts_uart4_recv_buf; //#define FOSC 11059200L //系统频率 //#define BAUD4 115200 //串口波特率 @@ -97,21 +95,16 @@ void L0_uart4_init(void)//115200bps@11.0592MHz void L0_uart4_buf_init(void) { - ts_uart[uNum4].p = &ts_uart_send_shop; + ts_uart[uNum4].p = &ts_uart_send_buf; ts_uart[uNum4].p->now = 0; ts_uart[uNum4].p->ok = D_ready; - ts_uart[uNum4].t = &s_uart4_rec; + ts_uart[uNum4].t = &ts_uart4_recv_buf; + ts_uart[uNum4].t->buf = uart4_recv_buf; ts_uart[uNum4].t->head_0 = D_CMD_Filter1_ff; ts_uart[uNum4].t->head_1 = D_CMD_Filter2_fe; ts_uart[uNum4].t->head = 0; ts_uart[uNum4].t->ok = 0; ts_uart[uNum4].tp_handler = L1_s2b_PH3; - ts_uart[uNum4].ack = (U8*)&s_uart4_ack; - - //s_uart4_tcp_rec.head_0 = D_CMD_Filter1_ff; - //s_uart4_tcp_rec.head_1 = D_CMD_Filter2_fe; - //s_uart4_tcp_rec.head = 0; - //s_uart4_tcp_rec.ok = 0; L0_uart4_init(); D_uart4_ES_INT(1); //打开串口中断 diff --git a/source/msp/UART4.h b/source/msp/UART4.h index b70da6c..b20adc3 100644 --- a/source/msp/UART4.h +++ b/source/msp/UART4.h @@ -81,8 +81,7 @@ void L0_uart4_sendArray(U8 * buf, U16 len); #define L0_uart4_sendstr(buf) L0_uartN_sendstr(uNum4,buf) #define L1_uart4_uchexArray(buf) L1_uartN_uchexArray(uNum4,buf) -extern TP_Handler_X s_uart4_rec; -extern TS_PH3_ccmodbus s_uart4_ack; +extern Ts_uart_recv_buf ts_uart4_recv_buf; #endif //#ifndef _uart4_H diff --git a/source/msp/time.c b/source/msp/time.c index 8007b26..166e8aa 100644 --- a/source/msp/time.c +++ b/source/msp/time.c @@ -43,63 +43,63 @@ void timer0_isrHandle (void) D_SERVE_TIMER0 -void L0_timer1_Init() //600微秒@11.0592MHz -{ -#if 0 - AUXR |= 0x40; //定时器时钟1T模式 - TMOD &= 0x0F; //设置定时器模式 - TL1 = 0x14; //设置定时初值 - TH1 = 0xE6; //设置定时初值 - TF1 = 0; //清除TF1标志 - TR1 = 1; //定时器1开始计时 - ET1 = 1; //add by cc - -#else - U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600); - AUXR |= 0x40; //定时器时钟1T模式 - TMOD &= 0x0F; //设置定时器模式 - //TL1 = 0xCD; //设置定时初始值 - //TH1 = 0xD4; //设置定时初始值 - TL1 = val; //设置定时初值 - TH1 = val >>8; //设置定时初值 - TF1 = 0; //清除TF1标志 - TR1 = 1; //定时器1开始计时 - ET1 = 1; //add by cc -#endif -} - - -void L0_timer1_restart() //600微秒@11.0592MHz -{ - U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600); - TR1 = 0; //先关闭,否则会重复中断,起不到resetart效果 -#if 1 - AUXR |= 0x40; //定时器时钟1T模式 - TMOD &= 0x0F; //设置定时器模式 - //TL1 = 0x14; //设置定时初值 - //TH1 = 0xE6; //设置定时初值 - TL1 = val; //设置定时初值 - TH1 = val >>8; //设置定时初值 - TF1 = 0; //清除TF1标志 - TR1 = 1; //定时器1开始计时 - ET1 = 1; //add by cc - -#else - AUXR |= 0x40; //定时器时钟1T模式 - TMOD &= 0x0F; //设置定时器模式 - TL1 = 0xCD; //设置定时初始值 - TH1 = 0xD4; //设置定时初始值 - TF1 = 0; //清除TF1标志 - TR1 = 1; //定时器1开始计时 - ET1 = 1; //add by cc -#endif -} - -void L0_timer1_stop(void) -{ - TR1 = 0; - TF1 = 0; -} +// void L0_timer1_Init() //600微秒@11.0592MHz +// { +// #if 0 +// AUXR |= 0x40; //定时器时钟1T模式 +// TMOD &= 0x0F; //设置定时器模式 +// TL1 = 0x14; //设置定时初值 +// TH1 = 0xE6; //设置定时初值 +// TF1 = 0; //清除TF1标志 +// TR1 = 1; //定时器1开始计时 +// ET1 = 1; //add by cc + +// #else +// U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600); +// AUXR |= 0x40; //定时器时钟1T模式 +// TMOD &= 0x0F; //设置定时器模式 +// //TL1 = 0xCD; //设置定时初始值 +// //TH1 = 0xD4; //设置定时初始值 +// TL1 = val; //设置定时初值 +// TH1 = val >>8; //设置定时初值 +// TF1 = 0; //清除TF1标志 +// TR1 = 1; //定时器1开始计时 +// ET1 = 1; //add by cc +// #endif +// } + + +// void L0_timer1_restart() //600微秒@11.0592MHz +// { +// U16 val = D_TIMER_COUNT(1,D_sys_MainFre,600); +// TR1 = 0; //先关闭,否则会重复中断,起不到resetart效果 +// #if 1 +// AUXR |= 0x40; //定时器时钟1T模式 +// TMOD &= 0x0F; //设置定时器模式 +// //TL1 = 0x14; //设置定时初值 +// //TH1 = 0xE6; //设置定时初值 +// TL1 = val; //设置定时初值 +// TH1 = val >>8; //设置定时初值 +// TF1 = 0; //清除TF1标志 +// TR1 = 1; //定时器1开始计时 +// ET1 = 1; //add by cc + +// #else +// AUXR |= 0x40; //定时器时钟1T模式 +// TMOD &= 0x0F; //设置定时器模式 +// TL1 = 0xCD; //设置定时初始值 +// TH1 = 0xD4; //设置定时初始值 +// TF1 = 0; //清除TF1标志 +// TR1 = 1; //定时器1开始计时 +// ET1 = 1; //add by cc +// #endif +// } + +// void L0_timer1_stop(void) +// { +// TR1 = 0; +// TF1 = 0; +// } /******************************END*********************************/ diff --git a/source/msp/uart_x.h b/source/msp/uart_x.h index bb8abf2..7f15530 100644 --- a/source/msp/uart_x.h +++ b/source/msp/uart_x.h @@ -56,12 +56,12 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../tpc/tpc_x.h" #include "../bsp/bsp_config.h" -#define D_uartN_free() (0 == ts_uart_send_shop[uartx].max) -#define D_uartN_busy() (0 != ts_uart_send_shop[uartx].max) +#define D_uartN_free() (0 == ts_uart_send_buf[uartx].max) +#define D_uartN_busy() (0 != ts_uart_send_buf[uartx].max) #define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t))) -typedef struct _ts_uart0_send_buf_ +typedef struct _ts_uart_send_buf_ { vU8 num; //接收到的数目注意数据长度的范围 vU8 *p; @@ -70,18 +70,31 @@ typedef struct _ts_uart0_send_buf_ vU32 over; /// 结束等待标志,over累加到某个值时,结束等待 vU8 ok; /// 发送完成标志 vU8 buf[D_UART_send_buf_max + 1]; -/// U8 buf2[D_send_buf2_max]; vU8 buf3[D_UART_send_buf2_max]; -//// U8 buf4[D_send_buf_max]; - /// U8 buf[D_send_buf_max + 1];//buffer 的第一位是 长度 }Ts_uart_send_buf; +typedef struct _ts_uart_recv_buf_ +{//8byte + vU8 reg; + vU8 head; //接收标志头标志 + vU8 cashe[2]; + vU8 head_0; + vU8 head_1; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 ok; //接收协议ok标志 + vU8 max; //接收到的数目的最大值 + vU8 *buf; ////协议缓冲,由每个串口根据需要的缓冲区大小自己定义 + vU8 *sp; + vU8 *sp2; //备份值,如果协议需要备份,单独提供备份缓冲区 + vU8 ocr; + vU8 crc[2]; +}Ts_uart_recv_buf; + typedef struct _TS_uart_reg { Ts_uart_send_buf idata *p; - TP_Handler_X *t; - void (*tp_handler)(TP_Handler_X *); - U8 *ack; //ack + Ts_uart_recv_buf *t; + void (*tp_handler)(Ts_uart_recv_buf *); }TS_uart_reg; extern TS_uart_reg idata ts_uart[SERIAL_MAX_NUM]; diff --git a/source/tpc/0d0a.c b/source/tpc/0d0a.c index da7a66f..ce381d1 100644 --- a/source/tpc/0d0a.c +++ b/source/tpc/0d0a.c @@ -8,7 +8,7 @@ //对于连续的多条协议,比如:abcdefg\r\n12345\r\n,如果前一条处理不及时,可能会被后一条覆盖 -void L1_s2b_0d0a(struct _tp_handler_x *p) //reentrant +void L1_s2b_0d0a(Ts_uart_recv_buf *p) //reentrant { if(p->head == 0) { diff --git a/source/tpc/0d0a.h b/source/tpc/0d0a.h index ddf5a39..4d5ea00 100644 --- a/source/tpc/0d0a.h +++ b/source/tpc/0d0a.h @@ -28,6 +28,6 @@ typedef struct _s_PC1_0D0A_ // U8 pro[16]; ///解析协议用 }TS_Handle_0d0a; #endif -extern void L1_s2b_0d0a(struct _tp_handler_x *p); //reentrant; +extern void L1_s2b_0d0a(Ts_uart_recv_buf *p); //reentrant; #endif diff --git a/source/tpc/ccmodbus.c b/source/tpc/ccmodbus.c index b847efa..5ed3de4 100644 --- a/source/tpc/ccmodbus.c +++ b/source/tpc/ccmodbus.c @@ -131,7 +131,7 @@ void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slave ///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) /// 0 1 2 3 4 5 6 7 8 9 10 /// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F -void L1_s2b_PH3(struct _tp_handler_x *p)// reentrant +void L1_s2b_PH3(Ts_uart_recv_buf *p)// reentrant { p->cashe[1] = p->cashe[0]; p->cashe[0] = p->reg;// diff --git a/source/tpc/ccmodbus.h b/source/tpc/ccmodbus.h index 80f9eff..e2e4ba6 100644 --- a/source/tpc/ccmodbus.h +++ b/source/tpc/ccmodbus.h @@ -92,7 +92,7 @@ typedef struct extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info); extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck); extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); -extern void L1_s2b_PH3(struct _tp_handler_x *p);// reentrant; +extern void L1_s2b_PH3(Ts_uart_recv_buf *p);// reentrant; #endif /* end __TPC_CCMODBUS_H_ */ diff --git a/source/tpc/debug.c b/source/tpc/debug.c index 59a0e4a..5781dda 100644 --- a/source/tpc/debug.c +++ b/source/tpc/debug.c @@ -1,4 +1,3 @@ - /***************************************************************************** update by cc @201501101001 针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 @@ -48,8 +47,20 @@ msp/uartx.c 底层代码 和cpu相关 //fd 01 02 03 06 fd为头 010203为数据 06为数据校验和(01+02+03) //对于连续的多条协议,如果前一条处理不及时,可能会被后一条覆盖 -void L1_s2b_PH1 (struct _tp_handler_x *p) //reentrant + + +void L1_s2b_debug (Ts_uart_recv_buf *p) //reentrant +{ + p->ok = 1; + LED0 ^= 1; + return; +} + + +void L1_s2b_PH1 (Ts_uart_recv_buf *p) //reentrant { + p->ok = 1; + return; if (0 == p->head) { if (D_HETU_FX_fi == (p->reg & p->head_0)) diff --git a/source/tpc/debug.h b/source/tpc/debug.h index 88d7231..71e847b 100644 --- a/source/tpc/debug.h +++ b/source/tpc/debug.h @@ -39,8 +39,10 @@ typedef struct }TS_P_debug; #define D_HETU_FX_buf_max 5 //定长协议 长度为5 +#define D_HETU_FX_fi 0x0F -extern void L1_s2b_PH1 (struct _tp_handler_x *p);// reentrant; +extern void L1_s2b_debug(Ts_uart_recv_buf *p); +extern void L1_s2b_PH1 (Ts_uart_recv_buf *p);// reentrant; #endif /* end __TPC_DEBUG_H_ */ /***************************************************************************** diff --git a/source/tpc/modbus.c b/source/tpc/modbus.c index f858244..b9d442d 100644 --- a/source/tpc/modbus.c +++ b/source/tpc/modbus.c @@ -36,8 +36,10 @@ msp/uartx.c 底层代码 和cpu相关 //MODBUS协议解析函数 //超出D_tp_handle_x_len,不继续保存数据 -void L1_s2b_PH4(struct _tp_handler_x *p) +void L1_s2b_PH4(Ts_uart_recv_buf *p) { + p->ok = 1; + return; //p->modbusstmp = D_sys_now; if(p->head == 0) { diff --git a/source/tpc/modbus.h b/source/tpc/modbus.h index 491bf66..570cb1c 100644 --- a/source/tpc/modbus.h +++ b/source/tpc/modbus.h @@ -101,8 +101,8 @@ extern U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info); //extern U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize); extern U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck); extern void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); -extern void L1_s2b_PH4(struct _tp_handler_x *p); -extern void L1_modbus_split(struct _tp_handler_x *p); +extern void L1_s2b_PH4(Ts_uart_recv_buf *p); +extern void L1_modbus_split(Ts_uart_recv_buf *p); #endif /* end __TPC_UART_H_ */ diff --git a/source/tpc/tpc_x.h b/source/tpc/tpc_x.h index 8956284..3d98c72 100644 --- a/source/tpc/tpc_x.h +++ b/source/tpc/tpc_x.h @@ -3,22 +3,6 @@ #include "../bsp/bsp_config.h" #include "../clib/type.h" - -typedef struct _tp_handler_x -{//8byte - vU8 reg; - vU8 head; //接收标志头标志 - vU8 cashe[2]; - vU8 head_0; - vU8 head_1; - vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 - vU8 ok; //接收协议ok标志 - vU8 max; //接收到的数目的最大值 - vU8 buf[D_TPC_HANDLER_X_LEN+16];////协议缓冲 - vU8 *sp; - vU8 *sp2; //备份值,如果协议需要备份,单独提供备份缓冲区 - vU8 ocr; - vU8 crc[2]; -}TP_Handler_X; +#include "../msp/uart_x.h" #endif