diff --git a/keilp/cc_as_stc02_ps5ws.uvprojx b/keilp/cc_as_stc02_ps5ws.uvprojx index 6782846..b131346 100644 --- a/keilp/cc_as_stc02_ps5ws.uvprojx +++ b/keilp/cc_as_stc02_ps5ws.uvprojx @@ -332,11 +332,6 @@ 1 ..\source\app\task_register.c - - task_modbus.c - 1 - ..\source\app\task_modbus.c - app_config.c 1 @@ -347,6 +342,26 @@ 1 ..\source\app\task_w600.c + + task_key.c + 1 + ..\source\app\task_key.c + + + app_task_tcp_control.c + 1 + ..\source\app\app_task_tcp_control.c + + + task_pen_head.c + 1 + ..\source\app\task_pen_head.c + + + app_task_tcp.c + 1 + ..\source\app\app_task_tcp.c + diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_sym b/si4/ps5ws.si4project/soft_ps5ws.sip_sym index f5b3cb8..b5284a5 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_sym and b/si4/ps5ws.si4project/soft_ps5ws.sip_sym differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xab b/si4/ps5ws.si4project/soft_ps5ws.sip_xab index 36c17d9..7f04d0b 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xab and b/si4/ps5ws.si4project/soft_ps5ws.sip_xab differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xad b/si4/ps5ws.si4project/soft_ps5ws.sip_xad index 1484248..7b602f6 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xad and b/si4/ps5ws.si4project/soft_ps5ws.sip_xad differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xc b/si4/ps5ws.si4project/soft_ps5ws.sip_xc index fc42b93..b9d5911 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xc and b/si4/ps5ws.si4project/soft_ps5ws.sip_xc differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xf b/si4/ps5ws.si4project/soft_ps5ws.sip_xf index 5ac518c..5139dad 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xf and b/si4/ps5ws.si4project/soft_ps5ws.sip_xf differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xm b/si4/ps5ws.si4project/soft_ps5ws.sip_xm index 8951bf7..53c354e 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xm and b/si4/ps5ws.si4project/soft_ps5ws.sip_xm differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xr b/si4/ps5ws.si4project/soft_ps5ws.sip_xr index 3db5d74..fecb06f 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xr and b/si4/ps5ws.si4project/soft_ps5ws.sip_xr differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsb b/si4/ps5ws.si4project/soft_ps5ws.sip_xsb index c1ff671..e7394d4 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xsb and b/si4/ps5ws.si4project/soft_ps5ws.sip_xsb differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsd b/si4/ps5ws.si4project/soft_ps5ws.sip_xsd index db7bf5f..bef1f5c 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xsd and b/si4/ps5ws.si4project/soft_ps5ws.sip_xsd differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.siproj b/si4/ps5ws.si4project/soft_ps5ws.siproj index c96ede9..5d040f0 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.siproj and b/si4/ps5ws.si4project/soft_ps5ws.siproj differ diff --git a/source/app/app_config.c b/source/app/app_config.c index e43bacb..9d74fbc 100644 --- a/source/app/app_config.c +++ b/source/app/app_config.c @@ -4,11 +4,15 @@ #include "../msp/eeprom.h" #include "../clib/clib.h" + + GlobalParam G; GlobalRegister R; +WR_Buf wr_buf; void L3_param_init(void) { + U8 i; G.debug = 1; //station模式状态 G.st_status = 0; //0:none 1:wifi_ok 2:tcp_connect_ok @@ -22,6 +26,13 @@ void L3_param_init(void) Lc_strcpy(G.ap_sid,"cc_pen_ap"); //ap模式pwd Lc_strcpy(G.ap_pwd,"ccsens123"); + + wr_buf.wIndex = wr_buf.rIndex = 0; + wr_buf.maxsize = POINT_LEN; + for(i=0;irIndex+1)%(p->maxsize) == p->wIndex) + p->full = 1; +} +U16 Lc_write_cyc_buf(PenPoint *wbuf ,WR_Buf *wp ,U16 wlen) +{ + U8 nulllen = (wp->maxsize - wp->wIndex + wp->rIndex - 1) % wp->maxsize; + if(nulllen >= wlen) + { + wp->readdr = (wp->wIndex + wlen) % wp->maxsize; + if(wp->readdr > wp->wIndex || wp->readdr == 0) + { + Lc_buf_copy_uc((U8 *)&wp->buf[wp->wIndex], (U8 *)wbuf, wlen); + } + else + { + wp->relen = wlen - wp->readdr; + Lc_buf_copy_uc((U8 *)&wp->buf[wp->wIndex], (U8 *)wbuf, wp->relen); + Lc_buf_copy_uc((U8 *)&wp->buf[0], (U8 *)(wbuf+wp->relen), wp->readdr); + } + wp->wIndex = wp->readdr; + return sizeof(wbuf); + } + else + { + //L0_uart0_sendstr("X"); + return 0; + } + +} +U16 Lc_read_cyc_buf(PenPoint *rbuf ,WR_Buf *rp ,U16 rlen) +{ + U8 validlen = (rp->maxsize - rp->rIndex + rp->wIndex) % rp->maxsize; + if(validlen >= rlen) + { + rp->readdr = (rp->rIndex + rlen) % rp->maxsize; + if(rp->readdr < rp->wIndex || rp->readdr == 0) + { + Lc_buf_copy_uc((U8 *)rbuf, (U8 *)&rp->buf[rp->rIndex],rlen); + } + else + { + rp->relen = rlen - rp->readdr; + Lc_buf_copy_uc((U8 *)rbuf,(U8 *) &rp->buf[rp->rIndex], rp->relen); + Lc_buf_copy_uc((U8 *)(rbuf+rp->relen), (U8 *)&rp->buf[0], rp->readdr); + } + rp->rIndex = rp->readdr; + return sizeof(rbuf); + } + else + { + return 0; + } } diff --git a/source/app/app_config.h b/source/app/app_config.h index 9fb5cab..d0a91a8 100644 --- a/source/app/app_config.h +++ b/source/app/app_config.h @@ -3,13 +3,17 @@ #include "../clib/type.h" #include "../bsp/bsp_config.h" -#include "../bsp/bsp_config.h" #include "../tpc/ccmodbus.h" +#include "../tpc/modbus.h" + + #define APP_VERSION 0x10 -#define SLAVER_TCP_SERVER_ID 0x10 +#define SLAVER_TCP_SERVER_ID 0x14 +#define APP_VERSION_HEX 0x11 //高4位主版本,低4位次版本 #define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 )) #define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000) +#define POINT_LEN 48 //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG @@ -18,42 +22,34 @@ //#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max )) -#define CCMD_SLAVER_INFO_MAX 4 +#define CCMD_SLAVER_INFO_MAX 3 +typedef struct pen_point +{ + U16 x_axis;//横坐标 + U16 y_axis;//纵坐标 + U32 time;//时间 +}PenPoint; typedef struct global_register { //RO Register - U16 w600_mode; - U16 pen_sta; - U16 pen_net_sta; - U16 pen_ele_sta; - U16 question_sta; - U16 spee_save; - U32 oid3_order; - U16 pack_order; - U16 frame_order; - U32 x_axis1; - U32 y_axis1; - U32 time1; - U32 x_axis2; - U32 y_axis2; - U32 time2; - CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX]; + U16 pen_sta;//点读笔状态 + U16 pen_net_sta;//联网状态 + U16 pen_ele_sta;//电池电量 + U16 question_sta;//问题 0上题 1下题 + U16 spee_order;//语音序号 + U32 oid3_order;//序号通知(oid3普通码) - //RW Register - U16 reserved2; - U16 zero; //清0标志,写入任何值清0(去皮) - U16 status_eep_save; //eep写入寄存器,1则写入eep并清0 - //U16 reset; //reset标志,写入任何值,所有参数恢复初始值 - struct - { //需要持久化的参数,不能超过72字节,否则会导致eeprom溢出 - U16 slaver_id; - }p; - U16 reserved3; - + char null[25]; + + U16 pack_order;//包序号 + U16 frame_order;//帧序号 + U16 pack_mask;//包标志 + PenPoint points[POINT_LEN]; }GlobalRegister; extern GlobalRegister R; + //寄存器内存基地址 #define REG_MEM_BASE ((U16*)(&R)) //寄存器基础地址(本文件外部不应该使用该宏定义) //变量地址转寄存器 @@ -64,15 +60,12 @@ extern GlobalRegister R; - - - - //STEP 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Global Variables CONFIG typedef struct global_param { //调试模式 U8 debug; + U8 reset; //station模式状态 U8 st_status; //0:none 1:wifi_ok 2:tcp_connect_ok //station模式sid @@ -85,15 +78,43 @@ typedef struct global_param U8 ap_sid[32]; //ap模式pwd U8 ap_pwd[32]; + //w600联网模式 + U16 w600_mode; + U16 status_eep_save; + U16 slaver_id; + + vU32 modbusstmp; + U16 authed; + U16 flowStarted; + U16 flowStartVal; + U8 mcu_id[7]; + + U8 pen_up; + + CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX]; }GlobalParam; -extern struct global_param G; -//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<slaverIndex].mask > 0) + { + s->pkglen = L3_pack_ccmodbus(&s->loopPkg,G.ccmd_slaver_info + s->slaverIndex); + s->ackFlag = 0; + s->retryTimes = 0; + L2_task_go(D_task_tcp_send_modbus_pkg); + } + else + { + L2_task_go(D_task_tcp_switch_next_slaver); + } + + TTSS_Task_step(D_task_tcp_send_modbus_pkg) //发送包 + L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); + s->sendStamp = s_nos_tick.t_1s; + if(G.ccmd_slaver_info[s->slaverIndex].mask == 1) + { + G.ccmd_slaver_info[s->slaverIndex].mask = 0; + } + L2_task_go(D_task_tcp_wait_modbus_ack); + TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack + //L0_uart0_uc(s_uart2_tcp_rec.ok + '0'); + if(s_uart2_tcp_rec.ok) + { + s_uart2_tcp_rec.ok = 0; + s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; + s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); + L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num); + if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver) + { + s->ackFlag = 1; + + switch(s->slaverIndex) + { + case 0://如果oper == 90:成功,91 == 不成功 + switch(G.ccmd_slaver_info[s->slaverIndex].oper) + { + case 0x90: + //L0_uart0_sendstr("11111"); + G.authed = 1; + break; + case 0x91: + G.authed = 0; + break; + } + #if 0 + if(G.ccmd_slaver_info[s->slaverIndex].oper == 0x90) + { + L0_uart0_sendstr("111"); + G.authed = 1; + G.au_succ = 1; + } + else + { + L0_uart0_sendstr("222"); + G.authed = 0; + G.au_fail = 1; + } + #endif + break; + case 2: + break; + default: + break; + } + } + + L2_task_go(D_task_tcp_switch_next_slaver); + } + else if(s_nos_tick.t_1s - s->sendStamp >= 5) //重发 + { + if(++s->retryTimes < 3) + { + L2_task_go(D_task_tcp_send_modbus_pkg); + } + else + { + L2_task_go(D_task_tcp_switch_next_slaver); + } + } + + //L0_uart0_uc(s->ackFlag); + + TTSS_Task_step(D_task_tcp_switch_next_slaver) //切换下一个 + if(++ s->slaverIndex >= CCMD_SLAVER_INFO_MAX) + { + s->slaverIndex = 0; + } + L2_task_go(D_task_tcp_constructor_modbus_pkg); + + TTSS_Task_end(); +} + + + diff --git a/source/app/app_task_tcp.h b/source/app/app_task_tcp.h index 1c2f7dd..429e097 100644 --- a/source/app/app_task_tcp.h +++ b/source/app/app_task_tcp.h @@ -2,8 +2,9 @@ #define APP_TASK_TCP #include "../ctask/task.h" -#include "../tpc/tpc_ccmodbus.h" -#include "app_common.h" +#include "../tpc/ccmodbus.h" +#include "../app/app_config.h" +#define U485_TIMEOUT 3 //3 x 100ms = 300ms typedef struct { @@ -18,11 +19,12 @@ typedef struct U16 treg; }TS_tcp; -#define U485_TIMEOUT 3 //3 x 100ms = 300ms + extern TS_tcp ts_tcp; -extern void L3_task_tcp_init(); +extern void L3_task_tcp_init(void); extern void L3_task_tcp_handle(TS_tcp *s); #endif + diff --git a/source/app/app_task_tcp_control.c b/source/app/app_task_tcp_control.c new file mode 100644 index 0000000..d2003eb --- /dev/null +++ b/source/app/app_task_tcp_control.c @@ -0,0 +1,80 @@ +#include "app_task_tcp_control.h" +#include "../msp/uart0.h" +#include "../app/task_w600.h" +#include "../app/app_task_tcp.h" + +TS_tcp_control ts_tcp_control; + +void L3_task_tcp_control_init(void) +{ + L1_task_init(&ts_tcp_control.task); + L3_task_s_go(ts_tcp_control,D_task_init); + ts_tcp_control.conn_ok_pool = 0; + ts_tcp_control.tcp_send_stmp = 0; +} + +#define D_task_tcp_control_01 0x51 +#define D_task_tcp_control_02 0x52 +#define D_task_tcp_control_03 0x53 + + +void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区满,调用读函数读取一段,从G->R, R.extra num 动态修改数量 + +{ + TTSS_Task_init() + L2_task_go(D_task_tcp_control_01); + TTSS_Task_step(D_task_tcp_control_01) + if(s->conn_ok_pool != s_task_gm35_flow.conn_ok) + { + G.authed = 0; + s->conn_ok_pool =s_task_gm35_flow.conn_ok; + } + L2_task_go(D_task_tcp_control_02); + TTSS_Task_step(D_task_tcp_control_02)//是否发认证包 + if(s_task_gm35_flow.conn_ok) + { + //3s一次发送数据包 + if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) + { + if(!G.authed) + { + //L0_uart0_sendstr("111"); + //发送认证包 + G.ccmd_slaver_info[0].mask = 1; + L2_task_go(D_task_tcp_control_01); + } + else + { + L2_task_go(D_task_tcp_control_03); + } + ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; + } + else if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 60) + { + G.ccmd_slaver_info[1].mask = 1; + L2_task_go(D_task_tcp_control_01); + ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; + } + } + + + TTSS_Task_step(D_task_tcp_control_03) + if(wr_buf.full == 1) + { + wr_buf.full = 0; + Lc_read_cyc_buf(&R.points ,&wr_buf ,POINT_LEN); + G.ccmd_slaver_info[2].mask = 1; + L2_task_go(D_task_tcp_control_01); + } + else if(G.pen_up == 1) + { + Lc_read_cyc_buf(&R.points ,&wr_buf ,sizeof(wr_buf.buf)/2); + G.ccmd_slaver_info[2].mask = 1; + L2_task_go(D_task_tcp_control_01); + } + TTSS_Task_end(); +} + + + + diff --git a/source/app/app_task_tcp_control.h b/source/app/app_task_tcp_control.h new file mode 100644 index 0000000..1d09935 --- /dev/null +++ b/source/app/app_task_tcp_control.h @@ -0,0 +1,22 @@ +#ifndef APP_TASK_TCP_CONTROL +#define APP_TASK_TCP_CONTROL + +#include "../ctask/task.h" +#include "../tpc/ccmodbus.h" +#include "../app/app_config.h" + + +typedef struct +{ + TS_task task; + vU8 conn_ok_pool; + vU32 tcp_send_stmp; +}TS_tcp_control; + +extern TS_tcp_control ts_tcp_control; + +extern void L3_task_tcp_control_init(void); +extern void L3_task_tcp_control_handle(TS_tcp_control *s); + +#endif + diff --git a/source/app/main.c b/source/app/main.c index e44745c..62a6eba 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -69,7 +69,7 @@ stc5ac32s void L0_main_init(void) { - Lc_delay_ms(200); + Lc_delay_ms(200); //板卡初始化 L0_board_config(); //串口0初始化 @@ -80,28 +80,31 @@ void L0_main_init(void) //L0_uart3_buf_init(); //Lc_delay_ms(100); L1_tick_init(); + //开启全局中断 EA = 1; - + //系统时钟初始化 L0_timer0_Init(); - + //L0_key_init(); //G初始化 L3_param_init(); //R初始化 L3_reg_init(); //485初始化 L2_485_init(); - + //寄存器监听任务初始化 L3_task_reglisten_init(); //w600任务初始化 L3_task_gm35_flow_init(W600_ST); - - //L3_task_tcp_init(); //485轮询任务初始化 - //L3_task_tcp_control_init(); + //笔头任务初始化 + L3_task_pen_head_init(); + //tcp轮询任务初始化 + L3_task_tcp_init(); + L3_task_tcp_control_init(); } //=============================================== @@ -111,7 +114,8 @@ void main(void) { //初始化 L0_main_init(); - + //获取mcu id + L0_id_get_rom(G.mcu_id); //打印版本信息 L0_uart0_sendArray("v1.0",4); @@ -122,20 +126,29 @@ void main(void) s_nos_tick.t1s_heatbeart = 0; //LED0 ^= 1; } - + + //WIFI L3_uart2_exp_protocol(&s_uart2_at); L2_task_gm35_flow_handle(&s_task_gm35_flow); - + + //笔头数据采集 + L3_task_pen_head_handle(&s_task_pen_head); + //寄存器值监控 - L3_task_reglisten_handle(&s_task_reglisten); + //L3_task_reglisten_handle(&s_task_reglisten); + //输出,响应485协议 - L3_task_modbus_handler(&s_uart0_rec); + //L3_task_modbus_handler(&s_uart0_rec); + + //按键处理 + //L3_task_key_handle(&s_task_key_handle); //L3_task_modbus_handler2(&s_uart2_rec); - //tcp发送 - //L3_task_tcp_handle(&ts_tcp); - + + //tcp发送 + L3_task_tcp_handle(&ts_tcp); + //tcp master->slaver发送逻辑控制 - //L3_task_tcp_control_handle(&ts_tcp_control); + L3_task_tcp_control_handle(&ts_tcp_control); } } //end main diff --git a/source/app/main.h b/source/app/main.h index 05cba94..6038f04 100644 --- a/source/app/main.h +++ b/source/app/main.h @@ -54,6 +54,10 @@ #include "../app/task_register.h" #include "../app/task_encrypt.h" #include "../app/task_w600.h" +#include "../app/task_key.h" +#include "../app/task_pen_head.h" +#include "../app/app_task_tcp.h" +#include "../app/app_task_tcp_control.h" ////////////////////////////////////////////////////////////////// diff --git a/source/app/task_key b/source/app/task_key new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/source/app/task_key @@ -0,0 +1 @@ + diff --git a/source/app/task_key.c b/source/app/task_key.c new file mode 100644 index 0000000..7c97085 --- /dev/null +++ b/source/app/task_key.c @@ -0,0 +1,126 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_test.c.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// +#include "task_key.h" +#include "../clib/clib.h" + +struct _s_task_key_ s_task_key_handle; +void L0_key_init(void) +{ + //使能 INT1下降沿中断 + IT0 = 0; + //外部中断允许 + EX0 = 1; + //使能 INT1下降沿中断 + IT1 = 0; + //外部中断允许 + EX1 = 1; + L1_task_init(&s_task_key_handle.task); + L3_task_s_go(s_task_key_handle,D_task_init); +} + +void INT0_isrHanddle(void) D_SERVE_INT0 +{ + struct _s_task_key_ *p = &s_task_key_handle; + EX0=0; //关中断 + //do sth + if(key1 == 0) + { + //Lc_delay_ms(10);//按键防抖 + if(key1 == 0) + { + p->key1_ok = 1; + while(!key1) + { + p->time1++; + } + } + } + IE0 = 0; //清除INT0中断程序执行过程中的中断请求 + EX0 = 1; //开中断 +} +void INT1_isrHanddle(void) D_SERVE_INT1 +{ + struct _s_task_key_ *p = &s_task_key_handle; + EX1 = 0; //关中断 + //do sth + if(key2 == 0) + { + //Lc_delay_ms(10); + if(key2 == 0) + { + p->key2_ok = 1; + while(!key2) + { + p->time2++; + } + } + } + IE1 = 0; //清除INT1中断程序执行过程中的中断请求 + EX1 = 1; //开中断 +} + +void L3_task_key_handle(struct _s_task_key_ *p) +{ + if(p->key1_ok) + { + if(p->time1>=180) + { + LED1 = ~LED1; + } + else + { + LED2 = ~LED2; + } + p->key1_ok = 0; + p->time1=0; + } + if(p->key2_ok) + { + if(p->time2>=180) + { + LED1 = ~LED1; + } + else + { + LED2 = ~LED2; + } + p->key2_ok = 0; + p->time2=0; + } + if(key3 == 0) + { + //Lc_delay_ms(10);//按键防抖 + if(key3 == 0) + { + p->key3_ok = 1; + while(!key3) + { + p->time3++; + } + } + } + if(p->key3_ok) + { + if(p->time3>=180) + { + LED1 = ~LED1; + } + else + { + LED2 = ~LED2; + } + p->key3_ok = 0; + p->time3=0; + } + +} + diff --git a/source/app/task_key.h b/source/app/task_key.h new file mode 100644 index 0000000..7635f4e --- /dev/null +++ b/source/app/task_key.h @@ -0,0 +1,33 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_test.c.c +/// @brief bsp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20180331 +/// @note cc_AS_stc02 +////////////////////////////////////////////////////////////////////////////// + +#ifndef _app_task_key_H +#define _app_task_key_H +#include "../bsp/bsp_config.h" +#include "../ctask/task.h" + + +struct _s_task_key_ +{ + TS_task task; + vU8 key1_ok; + vU8 key2_ok; + vU8 key3_ok; + vU8 time1; + vU8 time2; + vU8 time3; +}; +extern struct _s_task_key_ s_task_key_handle; +extern void L0_key_init(void); +extern void L3_task_key_handle(struct _s_task_key_ *p); +#endif + diff --git a/source/app/task_modbus.c b/source/app/task_modbus.c index 813fa9d..d4fd55e 100644 --- a/source/app/task_modbus.c +++ b/source/app/task_modbus.c @@ -4,178 +4,6 @@ //#include "../tpc/modbus.h" #include "../app/app_config.h" -U8 L3_pack_modbus_03(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num) -{ - U8 bufsize = 4; - pmodbus->slaver = slaverId; - pmodbus->oper = MODBUS_OPER_READ; - pmodbus->buf[0] = reg >> 8 & 0xFF; - pmodbus->buf[1] = reg >> 0 & 0xFF; - pmodbus->buf[2] = num >> 8 * 0xFF; - pmodbus->buf[3] = num >> 0 & 0xFF; - crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); - pmodbus->buf[bufsize] = pmodbus->crc[0]; - pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; - - return bufsize + 2 + 2; -} - -U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) -{ - U8 bufsize = 4; - pmodbus->slaver = slaverId; - pmodbus->oper = MODBUS_OPER_WRITE; - pmodbus->buf[0] = reg >> 8 & 0xFF; - pmodbus->buf[1] = reg >> 0 & 0xFF; - pmodbus->buf[2] = buf[0]; - pmodbus->buf[3] = buf[1]; - crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); - pmodbus->buf[bufsize] = pmodbus->crc[0]; - pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; - - return bufsize + 2 + 2; -} - -U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) -{ - U8 bufsize = 5,i = 0; - pmodbus->slaver = slaverId; - pmodbus->oper = MODBUS_OPER_WRITE_M; - pmodbus->buf[0] = reg >> 8 & 0xFF; - pmodbus->buf[1] = reg >> 0 & 0xFF; - pmodbus->buf[2] = num >> 8 * 0xFF; - pmodbus->buf[3] = num >> 0 & 0xFF; - pmodbus->buf[4] = bytes; - - for(i=0;ibuf[5+i] = buf[i]; - } - crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); - pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; - pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; - - return bufsize + bytes + 2 + 2; -} - -U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) -{ - switch(slaver_info->oper) - { - case MODBUS_OPER_READ: - return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); - case MODBUS_OPER_WRITE: - return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); - case MODBUS_OPER_WRITE_M: - return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); - default: - return 0; - } -} - -U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) -{ - pmodbus->slaver = slaver; - pmodbus->oper = oper; - crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); - pmodbus->buf[bufsize] = pmodbus->crc[0]; - pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; - - return bufsize + 2 + 2; -} - -//MODBUS从设备数据处理函数 -static Modbus03Ack *pModbus03Ack; -static Modbus06Ack *pModbus06Ack; -static Modbus10Ack *pModbus10Ack; -static U16 modbuslen = 0,reg,num,val,count; -U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) -{ - switch(pmodbus->oper) - { - case MODBUS_OPER_READ: - case MODBUS_OPER_READCONFIG: - { - U16 i = 0,j = 0,regval = 0; - pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; - reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 - { - for(i=0; ibuf[j++] = regval >> 8 & 0xFF; - pModbus03Ack->buf[j++] = regval & 0xFF; - } - pModbus03Ack->bytes = num * 2; - modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); - } - break; - } -#if 0 - case MODBUS_OPER_WRITE: - { - pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; - reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - if(reg <= sizeof(R)/2) - { - *(REG_2_MEM(reg)) = val; - pModbus06Ack->reg = reg; - pModbus06Ack->val = *(REG_2_MEM(reg)); - modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); - } - break; - } -#endif - case MODBUS_OPER_WRITE_M: - { - U16 i = 0; - pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; - reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); - num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); - count = pmodbus->buf[4]; - if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 - { - for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); - } - pModbus10Ack->reg = reg; - pModbus10Ack->num = num; - modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); - } - break; - } - default:break; - } - return modbuslen; -} - -//MODBUS主设备轮询时,从设备返回数据处理函数 -//MD_SLAVER_INFO需要被正确定义 -void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) -{ - switch(pmodbus->oper) - { - case MODBUS_OPER_READ: - case MODBUS_OPER_READCONFIG: - { - U8 i = 0; - for(i=0;ibuf[0];i++) - { - //此处假设字节序一致 - p_slaver_info->buf[i] = pmodbus->buf[i + 1]; - //TODO 字节序不一致时的处理 - } - break; - } - case MODBUS_OPER_WRITE: - case MODBUS_OPER_WRITE_M: - default: break; - } -} void L3_task_modbus_handler(TP_Handler_X *ph4) @@ -185,7 +13,7 @@ void L3_task_modbus_handler(TP_Handler_X *ph4) TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; //LED0 ^= 1; ph4->ok = 0; - if(ts_modbus->slaver == R.p.slaver_id || ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机 + if(ts_modbus->slaver == G.slaver_id || ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机 { U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack); L0_uart0_sendArray((U8*)&s_uart0_ack, acklen); @@ -205,22 +33,6 @@ void L3_task_modbus_handler(TP_Handler_X *ph4) #endif } } -void L3_task_modbus_handler2(TP_Handler_X *ph4) -{ - if(s_uart2_rec.ok) - { - TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf; - //LED0 ^= 1; - s_uart2_rec.ok=0; - L0_uart0_sendArray(s_uart2_rec.buf, s_uart2_rec.num); - } - if(s_uart2_rec.yes) - { - s_uart2_rec.yes=0; - L0_uart0_sendArray(s_uart2_rec.buf, s_uart2_rec.num); - } - -} diff --git a/source/app/task_pen_head.c b/source/app/task_pen_head.c new file mode 100644 index 0000000..1f0aa4e --- /dev/null +++ b/source/app/task_pen_head.c @@ -0,0 +1,35 @@ +#include "task_pen_head.h" + +struct _s_task_pen_head_ s_task_pen_head; + + +void L3_task_pen_head_init() +{ + L1_task_init(&s_task_pen_head.task); + L3_task_s_go(s_task_pen_head,D_task_init); +} +#define TTSS_TASK_HEAD_DATA_WRITE 0x01 + +U8 i = 0; +void L3_task_pen_head_handle(struct _s_task_pen_head_ *s) +{ + TTSS_Task_init() + L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,0); + TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE) + { + s->point.x_axis = i; + s->point.y_axis = i; + s->point.time = D_sys_now; + i++; + Lc_write_cyc_buf(&s->point,&wr_buf,1); + Lc_buf_full(&wr_buf); + } + L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,D_Tdelay_20ms); + TTSS_Task_end(); +} + + + + + + diff --git a/source/app/task_pen_head.h b/source/app/task_pen_head.h new file mode 100644 index 0000000..69646b8 --- /dev/null +++ b/source/app/task_pen_head.h @@ -0,0 +1,22 @@ +#ifndef _app_task_pen_head_H +#define _app_task_pen_head_H + +#include "../bsp/bsp_config.h" +#include "../bsp/w600.h" +#include "../ctask/task.h" +#include "../tpc/at0d0a.h" +#include "../tpc/ccmodbus.h" +#include "../app/app_config.h" +struct _s_task_pen_head_ +{ + TS_task task; + vU32 last_write_time; + vU32 now_write_time; + vU32 time_lag; + PenPoint point; +}; +extern struct _s_task_pen_head_ s_task_pen_head; +extern void L3_task_pen_head_init(); +extern void L3_task_pen_head_handle(struct _s_task_pen_head_ *s); + +#endif \ No newline at end of file diff --git a/source/app/task_register.c b/source/app/task_register.c index f715e06..1499c64 100644 --- a/source/app/task_register.c +++ b/source/app/task_register.c @@ -36,21 +36,21 @@ void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s) L2_task_go(D_task_WEIGHT_COUNT); TTSS_Task_step(D_task_WEIGHT_COUNT) - if(R.w600_mode == 1) + if(G.w600_mode == 1) { L3_gm35_send_str("+++"); Lc_delay_ms(1000); //s_task_gm35_flow.mode=W600_AP; L3_task_gm35_flow_init(W600_AP); - R.w600_mode = 0; + G.w600_mode = 0; } L2_task_go(D_task_IAP); //延时100ms TTSS_Task_step(D_task_IAP) - if(R.status_eep_save != 0) + if(G.status_eep_save != 0) { - R.status_eep_save = 0; + G.status_eep_save = 0; L3_reg_2_iap();//写入IAP } L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms diff --git a/source/app/task_w600.c b/source/app/task_w600.c index bae8706..d3871a4 100644 --- a/source/app/task_w600.c +++ b/source/app/task_w600.c @@ -17,8 +17,8 @@ #include "../msp/uart0.h" struct _s_task_gm35_gprs_ s_task_gm35_flow; -TS_tcp_control ts_tcp_control; -TS_tcp ts_tcp; +//TS_tcp_control ts_tcp_control; +//TS_tcp ts_tcp; @@ -48,7 +48,7 @@ void L3_gm35_send_str(U8 *str) //将数据放入gm35待发送缓冲区 void L3_gm35_send_data(U8 *buf , U8 len) { - L3_gm35_send_str(_cipsend_hex(len)); + //L3_gm35_send_str(_cipsend_hex(len)); L0_uart2_sendArray(buf,len); if(G.debug) { @@ -62,7 +62,7 @@ void L3_gm35_rcv_data(U8* buf,U8 num) { L0_uart0_sendstr("ATRCV="); L0_uart0_uchex(num); - L0_uart0_sendArray(buf,num); + L0_uart0_sendArray(buf,num+3); } } @@ -170,23 +170,6 @@ void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p) //------------------------------------------------------ gm35 tasks -------------------------------- -void L3_task_tcp_init(void) -{ - L1_task_init(&ts_tcp.task); - L3_task_s_go(ts_tcp,D_task_init); - ts_tcp.slaverIndex = 0; - ts_tcp.pkglen = 0; - ts_tcp.retryTimes = 0; - ts_tcp.ackFlag = 0; -} - -void L3_task_tcp_control_init(void) -{ - L1_task_init(&ts_tcp_control.task); - L3_task_s_go(ts_tcp_control,D_task_init); - ts_tcp_control.conn_ok_pool = 0; - ts_tcp_control.tcp_send_stmp = 0; -} void L3_task_gm35_flow_init(U8 mode) { @@ -194,7 +177,7 @@ void L3_task_gm35_flow_init(U8 mode) L3_task_s_go(s_task_gm35_flow,D_task_init); s_task_gm35_flow.mode = mode; s_task_gm35_flow.send = 0; - + s_task_gm35_flow.conn_ok = 0; #if 0 g_at_send_status.send_lock = 0; g_at_send_status.module_ok = 0; @@ -219,28 +202,28 @@ void L3_task_gm35_flow_init(U8 mode) //------------------------ GM35 Flow Handle ----------------------------------- -#define TTSS_TASK_GM35_MODE 0x01 - -#define TTSS_TASK_GM35_FLOW_ATEQV 0x02 -#define TTSS_TASK_GM35_FLOW_ST 0x03 -#define TTSS_TASK_GM35_FLOW_ST_WIFI 0x04 -#define TTSS_TASK_GM35_FLOW_ST_CIPMUX0 0x05 -#define TTSS_TASK_GM35_FLOW_ST_TCP 0x06 -#define TTSS_TASK_GM35_FLOW_ST_CIPMODE1 0x07 -#define TTSS_TASK_GM35_FLOW_ST_CIPSEND 0x08 -#define TTSS_TASK_GM35_FLOW_ST_DATA 0x09 -#define TTSS_TASK_GM35_FLOW_ST_CIPMODE0 0x10 - -#define TTSS_TASK_GM35_FLOW_AP 0x20 -#define TTSS_TASK_GM35_FLOW_AP_WIFI 0x21 -#define TTSS_TASK_GM35_FLOW_AP_CIPMUX1 0x22 -#define TTSS_TASK_GM35_FLOW_AP_SERVER 0x23 -#define TTSS_TASK_GM35_FLOW_TCP_TIME 0x24 -#define TTSS_TASK_GM35_FLOW_AP_DATA 0x25 -#define TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT 0x26 +#define TTSS_TASK_GM35_MODE 0x01 + +#define TTSS_TASK_GM35_FLOW_ATEQV 0x02 +#define TTSS_TASK_GM35_FLOW_ST 0x03 +#define TTSS_TASK_GM35_FLOW_ST_WIFI 0x04 +#define TTSS_TASK_GM35_FLOW_ST_CIPMUX0 0x05 +#define TTSS_TASK_GM35_FLOW_ST_TCP 0x06 +#define TTSS_TASK_GM35_FLOW_ST_CIPMODE1 0x07 +#define TTSS_TASK_GM35_FLOW_ST_CIPSEND 0x08 +#define TTSS_TASK_GM35_FLOW_ST_DATA 0x09 +#define TTSS_TASK_GM35_FLOW_ST_CIPMODE0 0x10 + +#define TTSS_TASK_GM35_FLOW_AP 0x20 +#define TTSS_TASK_GM35_FLOW_AP_WIFI 0x21 +#define TTSS_TASK_GM35_FLOW_AP_CIPMUX1 0x22 +#define TTSS_TASK_GM35_FLOW_AP_SERVER 0x23 +#define TTSS_TASK_GM35_FLOW_TCP_TIME 0x24 +#define TTSS_TASK_GM35_FLOW_AP_DATA 0x25 +#define TTSS_TASK_GM35_FLOW_AP_TCP_CONN_WAIT 0x26 #define TTSS_TASK_GM35_FLOW_AP_WIFI_DATA_STA_WAIT 0x27 -#define TTSS_TASK_MODE_TRAN 0x28 -#define TTSS_TASK_MODE_SERVER_CLOSE 0x29 +#define TTSS_TASK_MODE_TRAN 0x28 +#define TTSS_TASK_MODE_SERVER_CLOSE 0x29 #define INS_TIMEOUT 5 @@ -259,7 +242,7 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) L3_gm35_send_str(AT_INS_ATE0); s->ins_ok = 0; s->ins_stmp = s_nos_tick.t_1s; - s->send = 1; + s->send = 1; } else if(s->ins_ok == 1) //等待 { @@ -342,7 +325,6 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPMODE1,D_Tdelay_3s); } - else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; @@ -360,25 +342,39 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) s->send = 0; L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_3s); } - + else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) + {//超时重发 + s->send = 0; + } + TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND) + if(s->send == 0) + {//发送 + L3_gm35_send_str(AT_INS_ST_CIPSEND); + s->ins_ok = 0; + s->st_error = 0; + s->ins_stmp = s_nos_tick.t_1s; + s->send = 1; + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_CIPSEND,D_Tdelay_500ms);//发完之后要等,不然st_error == 0没用 ,没收到error之前也是=0 + } else if(1 == s->st_error) { - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST,0); + s->send = 0; + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_TCP,0); + } + else if(0 == s->st_error) + { + s->send = 0; + + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,0); } else if(s_nos_tick.t_1s - s->ins_stmp > INS_TIMEOUT) {//超时重发 s->send = 0; - } - TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_CIPSEND) - L3_gm35_send_str(AT_INS_ST_CIPSEND); - s->ins_ok = 0; - s->conn_ok = 0; - s->ins_stmp = s_nos_tick.t_1s; - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_300ms); + } TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA) //L0_uart2_sendstr("abcdefg"); - s->conn_ok = 1; - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_3s); + s_task_gm35_flow.conn_ok = 1; + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_1s); @@ -552,101 +548,4 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) TTSS_Task_end(); } -#define D_task_tcp_constructor_modbus_pkg 0x41 -#define D_task_tcp_send_modbus_pkg 0x42 -#define D_task_tcp_wait_modbus_ack 0x43 -#define D_task_tcp_switch_next_slaver 0x44 - -void L3_task_tcp_handle(TS_tcp *s) -{ - TTSS_Task_init(); - L2_task_go(D_task_tcp_constructor_modbus_pkg); - - TTSS_Task_step(D_task_tcp_constructor_modbus_pkg) //构造包 - if(R.ccmd_slaver_info[s->slaverIndex].mask > 0) - { - s->pkglen = L3_pack_ccmodbus(&s->loopPkg,R.ccmd_slaver_info + s->slaverIndex); - s->ackFlag = 0; - s->retryTimes = 0; - L2_task_go(D_task_tcp_send_modbus_pkg); - } - else - { - L2_task_go(D_task_tcp_switch_next_slaver); - } - - TTSS_Task_step(D_task_tcp_send_modbus_pkg) //发送包 - L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); - s->sendStamp = s_nos_tick.t_1s; - if(R.ccmd_slaver_info[s->slaverIndex].mask == 1) - { - R.ccmd_slaver_info[s->slaverIndex].mask = 0; - } - L2_task_go(D_task_tcp_wait_modbus_ack); - - TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack - if(s_uart2_tcp_rec.ok) - { - s_uart2_tcp_rec.ok = 0; - s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; - - s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); - L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num + 3); - if(s->pAckPkg->slaver == R.ccmd_slaver_info[s->slaverIndex].slaver) - { - s->ackFlag = 1; - - } - } - if(s->ackFlag == 1 || s_nos_tick.t_1s - s->sendStamp >= 5) //收到ack或者超时 - { - L2_task_go(D_task_tcp_switch_next_slaver); - } - - TTSS_Task_step(D_task_tcp_switch_next_slaver) //切换下一个 - if(++ s->slaverIndex >= CCMD_SLAVER_INFO_MAX) - { - s->slaverIndex = 0; - } - L2_task_go(D_task_tcp_constructor_modbus_pkg); - - TTSS_Task_end(); -} - - -#define D_task_tcp_control_01 0x51 -#define D_task_tcp_control_02 0x52 - - -void L3_task_tcp_control_handle(TS_tcp_control *s) -{ - TTSS_Task_init(); - L2_task_go(D_task_tcp_control_01); - - TTSS_Task_step(D_task_tcp_control_01) - if(s->conn_ok_pool != s_task_gm35_flow.conn_ok) - { - s->conn_ok_pool = s_task_gm35_flow.conn_ok; - } - L2_task_go(D_task_tcp_control_02); - - TTSS_Task_step(D_task_tcp_control_02) - if(s_task_gm35_flow.conn_ok) - { - //3s一次发送数据包 - if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) - { - R.ccmd_slaver_info[0].mask = 1; - ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; - } - } - L2_task_go(D_task_tcp_control_01); - - TTSS_Task_end(); -} - - -/********************************************************/ - - diff --git a/source/app/task_w600.h b/source/app/task_w600.h index e708a9f..20c869d 100644 --- a/source/app/task_w600.h +++ b/source/app/task_w600.h @@ -25,7 +25,7 @@ #define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式 //#define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" //网络查询指令 #define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" //GPRS操作指令 -#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"test.tall.wiki\",49000\r\n" //连接服务器 +#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.83\",4001\r\n" //连接服务器 #define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //发送数据 #define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //主动关闭连接 #define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //查询连接状态 @@ -55,6 +55,7 @@ struct _s_task_gm35_gprs_ vU8 ap_conn_ok; vU8 ap_rec_ok; vU8 st_cip_ok; + vU8 st_send_ok; vU8 ap_tcp_ok; vU8 ap_data_ok; vU8 st_error; @@ -62,9 +63,6 @@ struct _s_task_gm35_gprs_ vU8 send_lock; vU8 module_ok; - vU8 sim_ok; - vU8 net_ok; - vU8 gprs_ok; vU8 conn_ok; vU8 status_query_ok; vU32 ins_stmp; //指令时间戳 @@ -90,40 +88,18 @@ extern struct _s_task_gm35_gprs_ s_task_gm35_flow; #define STATUS_GM35_TCP_OK 5 #define BUF_SIZE 5 #define BUF_MAX 32 //注意缓冲区的长度 -typedef struct -{ - TS_task task; - TS_PH3_ccmodbus loopPkg; - TS_PH3_ccmodbus *pAckPkg; - U8 slaverIndex; - U8 pkglen; - U32 sendStamp; - U8 retryTimes; - U8 ackFlag; - U16 treg; -}TS_tcp; - - -typedef struct -{ - TS_task task; - vU8 conn_ok_pool; - vU32 tcp_send_stmp; -}TS_tcp_control; -extern TS_tcp_control ts_tcp_control; + extern struct _s_task_gm35_gprs_ s_task_gm35_flow; -extern TS_tcp ts_tcp; -#define U485_TIMEOUT 3 //3 x 100ms = 300ms -extern TS_tcp ts_tcp; -extern void L3_task_tcp_control_init(); -extern void L3_task_tcp_init(); + extern struct _s_task_gm35_gprs_ s_task_gm35_flow; extern void L3_gm35_send_str(U8 *str); +extern void L3_gm35_send_data(U8 *buf , U8 len); +extern void L3_gm35_rcv_data(U8* buf,U8 num); extern void L3_task_gm35_flow_init(U8 mode); extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s); @@ -131,9 +107,6 @@ extern void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s); extern void L3_uart2_exp_protocol(struct _s_PC1_0D0A_ *p); -extern void L3_task_tcp_handle(TS_tcp *s); - -extern void L3_task_tcp_control_handle(TS_tcp_control *s); #endif diff --git a/source/bsp/bsp_config.c b/source/bsp/bsp_config.c index 7f3dbdb..d6942b5 100644 --- a/source/bsp/bsp_config.c +++ b/source/bsp/bsp_config.c @@ -54,7 +54,7 @@ void L0_board_config(void) //485 RE/DE 配置推完输出 P55 //BITN_0(P5M1,BITN5);BITN_1(P5M0,BITN5); - + //LED //D_stdIO_P1(BITN7); //D_stdIO_P5(BITN5); @@ -70,7 +70,15 @@ void L0_board_config(void) D_stdIO_P3(BITN5); D_stdIO_P3(BITN6); D_stdIO_P3(BITN7); - + D_HighI_P2(BITN7); + D_HighI_P2(BITN6); + //D_HighI_P5(BITN5); + D_HighI_P0(BITN2); + D_OpenD_P5(BITN5); + D_OpenD_P4(BITN0); + D_HighI_P3(BITN4); + D_HighI_P5(BITN0); + #if (TYPE_WDT_ENABLE == D_WDT_STATUS) WDT_CONTR = 0x27; //使能看门狗,22M时钟下溢出时间约为5s,请注意添加喂狗程序 #else diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h index 84c4f84..e915041 100644 --- a/source/bsp/bsp_config.h +++ b/source/bsp/bsp_config.h @@ -77,7 +77,7 @@ #define D_MCU_NAME "STC8H3K64S4" //存储器特殊参数地址配置 - #define D_MCU_SPEC_PARAM_CHIPID 0xBFF9 + #define D_MCU_SPEC_PARAM_CHIPID 0xFDF9 //...其他参数 //串口配置 @@ -115,8 +115,10 @@ //笔头 #define SCK P34 #define SDIO P50 - - + //按键 + #define key1 P32 + #define key2 P33 + #define key3 P40 //EEP存储地址定义 #define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes #define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等 diff --git a/source/clib/clib.c b/source/clib/clib.c index a5cfafe..951b58e 100644 --- a/source/clib/clib.c +++ b/source/clib/clib.c @@ -96,6 +96,7 @@ void Lc_buf_copy_uc(U8 *dst,U8 *src,U8 len) } } + vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c) { if(a > b) @@ -331,7 +332,7 @@ void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/ CRC[1]=wcrc>>8;//crc的高八位 } -#if 0 +#if 1 void crc16_irq(unsigned char *CRC,void *dat,unsigned int len) { unsigned char *ptr = (unsigned char *)dat; diff --git a/source/clib/clib.h b/source/clib/clib.h index 70f0109..127388b 100644 --- a/source/clib/clib.h +++ b/source/clib/clib.h @@ -99,7 +99,7 @@ extern void Lc_array_sort(S32 arr[],int n); /// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; -//extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); +extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); extern int isBigEndianOrder(void); extern U32 ntohl(U32 dat); extern U32 htonl(U32 dat); diff --git a/source/ctask/tick.h b/source/ctask/tick.h index 35a26d8..fd85754 100644 --- a/source/ctask/tick.h +++ b/source/ctask/tick.h @@ -45,10 +45,14 @@ extern struct _s_nos_tick_ s_nos_tick; #define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) #define D_Tdelay_5ms ((5-1) / JIFFIES + 1) #define D_Tdelay_10ms ((10-1) / JIFFIES + 1) +#define D_Tdelay_20ms ((20-1) / JIFFIES + 1) + #define D_Tdelay_100ms ((100-1) / JIFFIES + 1) #define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) #define D_Tdelay_300ms ((300-1) / JIFFIES + 1) #define D_Tdelay_400ms ((400-1) / JIFFIES + 1) +#define D_Tdelay_500ms ((500-1) / JIFFIES + 1) + #define D_Tdelay_1s (1 * HZ) #define D_Tdelay_2s (2 * HZ) #define D_Tdelay_3s (3 * HZ) diff --git a/source/msp/UART0.C b/source/msp/UART0.C index 0ba46d1..c158a2f 100644 --- a/source/msp/UART0.C +++ b/source/msp/UART0.C @@ -127,7 +127,7 @@ void INTERRUPT_UART(void) D_SERVE_UART { // LED0 ^= 1; L0_uart0_IntRIClear(); //清除接收中断标志 - ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); + ts_uart[uNum0].t->reg = SBUF; //ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); L1_s2b_PH4(ts_uart[uNum0].t); L0_timer3_restart(); @@ -138,7 +138,8 @@ void INTERRUPT_UART(void) D_SERVE_UART L0_uart0_IntTIClear(); //清除发送中断标志 if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now) { - L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]); + SBUF = ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]; + //L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]); ts_uart[uNum0].p->now ++; } else @@ -157,11 +158,10 @@ void INTERRUPT_UART(void) D_SERVE_UART void timer3_isrHanddle(void) D_SERVE_TIMER3 { struct _tp_handler_x *p1 = &s_uart0_rec; - struct _tp_handler_x *p2 = &s_uart2_rec; if((p1->head == 1) && (p1->num >= D_s_modbus_min)) { p1->head = 0; - crc16(p1->crc,p1->buf,p1->num - 2); //校验CRC + crc16_irq(p1->crc,p1->buf,p1->num - 2); //校验CRC if(p1->crc[0] == p1->buf[p1->num-2] && p1->crc[1] == p1->buf[p1->num-1]) { p1->ok = 1; @@ -172,19 +172,6 @@ void timer3_isrHanddle(void) D_SERVE_TIMER3 p1->yes = 1; } } - if((p2->head == 1) && (p2->num >= D_s_modbus_min)) - { - p2->head = 0; - crc16(p2->crc,p2->buf,p2->num - 2); //校验CRC - if(p2->crc[0] == p2->buf[p2->num-2] && p2->crc[1] == p2->buf[p2->num-1]) - { - p2->ok = 1; - } - else - { - p2->yes = 1; - } - } L0_timer3_stop(); } diff --git a/source/msp/UART2.C b/source/msp/UART2.C index 4e18b00..e746df4 100644 --- a/source/msp/UART2.C +++ b/source/msp/UART2.C @@ -61,10 +61,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 //#define _USE_485 static volatile Ts_uart_send_buf idata ts_uart_send_shop; -TP_Handler_X s_uart2_rec; -TS_PH4_modbus s_uart2_ack; +//TP_Handler_X s_uart2_rec; +//TS_PH4_modbus s_uart2_ack; struct _s_PC1_0D0A_ s_uart2_at; TS_Handle_PH3 s_uart2_tcp_rec; +void (*Lp0_uart2_fun)(unsigned char sbufreg); void L0_uart2_init(void) { @@ -84,14 +85,18 @@ void L0_uart2_buf_init(void) ts_uart[uNum2].p = &ts_uart_send_shop; ts_uart[uNum2].p->now = 0; ts_uart[uNum2].p->ok = D_ready; - ts_uart[uNum2].t = &s_uart2_rec; + //ts_uart[uNum2].t = &s_uart2_rec; ts_uart[uNum2].t->head = 0; ts_uart[uNum2].t->ok = 0; ts_uart[uNum2].tp_handler = NULL; - ts_uart[uNum2].ack = (U8*)&s_uart2_ack; + //ts_uart[uNum2].ack = (U8*)&s_uart2_ack; L0_uart2_init(); D_uart2_ES_INT(1); //打开串口中断 + + //配置串口对应的操作协议 + L1_uart_tpc_config(); + #if (D_UART2_485_TYPE != TYPE_485_NONE) D_UART2_485_RX() //默认处于接收状态 #endif @@ -104,6 +109,28 @@ void L0_uart2_sendArray(U8 * buf, U16 len) #endif L0_uartN_sendArray(uNum2,buf,len); } +void L1_s2b_gm35(unsigned char sbufreg) +{ + s_uart2_tcp_rec.reg = sbufreg; + L1_s2b_PH3(&s_uart2_tcp_rec); + if(0 == s_uart2_tcp_rec.head) + { + s_uart2_at.reg = sbufreg; + L1_s2b_0d0a(&s_uart2_at); + } + else + { + s_uart2_at.head = 0; + } +} +void L1_uart_tpc_config(void) +{ + s_uart2_tcp_rec.head = 0; + s_uart2_tcp_rec.ok = 0; + s_uart2_tcp_rec.head_0 = D_CMD_Filter1_ff; + s_uart2_tcp_rec.head_1 = D_CMD_Filter2_fe; + s_uart2_tcp_rec.sp = (U8*)&(s_uart2_tcp_rec.ts_ccmodbus); +} /************************************************* UART 中断 @@ -114,20 +141,21 @@ void INTERRUPT_uart2(void) D_SERVE_uart2// using 2 //NOP(); NOP(); NOP(); if(L0_uart2_IntRI()) //如果是U2接收中断 { - //LED0 ^= 1; + //LED1 ^= 1; L0_uart2_IntRIClear(); //清除接收中断标志 //ts_uart[uNum2].t->reg = L0_uartN_get(uNum2); //ts_uart[uNum2].tp_handler(ts_uart[uNum2].t); - s_uart2_at.reg = L0_uartN_get(uNum2); - L1_s2b_0d0a(&s_uart2_at); - L0_timer3_restart(); + //s_uart2_at.reg = L0_uartN_get(uNum2); + //L1_s2b_0d0a(&s_uart2_at); + L1_s2b_gm35(L0_uart2_get()); } if(L0_uart2_IntTI()) //如果是U0发送中断 { L0_uart2_IntTIClear(); //清除发送中断标志 if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now) { - L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); + S2BUF = ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]; + //L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); ts_uart[uNum2].p->now ++; } else diff --git a/source/msp/UART2.h b/source/msp/UART2.h index 32c69ae..cf66fe8 100644 --- a/source/msp/UART2.h +++ b/source/msp/UART2.h @@ -56,9 +56,9 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../bsp/bsp_config.h" #include "../tpc/at0d0a.h" -#include "../tpc/ccmodbus.h" - +#include "../tpc/modbus.h" #include "uart_x.h" +#include "../tpc/ccmodbus.h" #define uNum2 1 @@ -67,6 +67,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI) #define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) #define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) +#define L0_uart2_get() (S2BUF) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -81,10 +82,13 @@ void uart2_Handdle(void); #define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X) #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_PH4_modbus s_uart2_ack; +//extern TP_Handler_X s_uart2_rec; +//extern TS_PH4_modbus s_uart2_ack; extern TS_Handle_0d0a s_uart2_at; extern TS_Handle_PH3 s_uart2_tcp_rec; +extern void (*Lp0_uart2_fun)(unsigned char sbufreg); + +extern void L1_uart_tpc_config(void); #endif //#ifndef _uart2_H diff --git a/source/tpc/at0d0a.c b/source/tpc/at0d0a.c index 7a5f7a7..11e7536 100644 --- a/source/tpc/at0d0a.c +++ b/source/tpc/at0d0a.c @@ -25,8 +25,13 @@ void L1_s2b_0d0a(struct _s_PC1_0D0A_ *p)// reentrant { if(1 != p->ok) { + U8 i = 0; p->buf[0] = p->num - 2; //去掉0d0a - Lc_buf_copy_uc(p->buf + 1,p->__buf,p->num-2); + //Lc_buf_copy_uc(p->buf + 1,p->__buf,p->num-2); + for(i=0;inum-2;i++) + { + p->buf[1+i] = p->__buf[i]; + } p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 } } diff --git a/source/tpc/ccmodbus.c b/source/tpc/ccmodbus.c index 688b01c..6a92d36 100644 --- a/source/tpc/ccmodbus.c +++ b/source/tpc/ccmodbus.c @@ -30,10 +30,10 @@ msp/uartx.c 底层代码 和cpu相关 ********************************************************************************/ #include "ccmodbus.h" +#include "modbus.h" #include "../clib/clib.h" -vU8 D_CMD_Filter1_ff; -vU8 D_CMD_Filter2_fe; -#if 0 +#include "../app/app_config.h" + U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) { U8 bufsize = 4; @@ -49,7 +49,6 @@ U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) return bufsize + 2 + 2; } - U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) { U8 bufsize = 4; @@ -66,9 +65,11 @@ U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) return bufsize + 2 + 2; } -U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf,U16 extra_num) { U8 bufsize = 5,i = 0; + num += extra_num; + bytes = num*2; pmodbus->slaver = slaverId; pmodbus->oper = MODBUS_OPER_WRITE_M; pmodbus->buf[0] = reg >> 8 & 0xFF; @@ -87,31 +88,33 @@ U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, return bufsize + bytes + 2 + 2; } -#endif -U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) + +U8 L3_pack_ccmodbus_90(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) { - U8 bufsize = 4; + U8 bufsize = 12,i = 0,j = 0; pmodbus->slaver = slaverId; - pmodbus->oper = MODBUS_OPER_READ; - pmodbus->buf[0] = reg >> 8 & 0xFF; - pmodbus->buf[1] = reg >> 0 & 0xFF; - pmodbus->buf[2] = num >> 8 * 0xFF; - pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->oper = MODBUS_OPER_AUTH; + pmodbus->buf[0] = APP_VERSION_HEX >> 4 & 0xF; //major version + pmodbus->buf[1] = APP_VERSION_HEX >> 0 & 0xF; //minor version + pmodbus->buf[2] = 0x00; //mq high + pmodbus->buf[3] = 0x04; //mq low + pmodbus->buf[4] = 0x00; // + for(i=5;ibuf[i] = G.mcu_id[j]; + j++; + } crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); pmodbus->buf[bufsize] = pmodbus->crc[0]; pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; return bufsize + 2 + 2; } -U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +U8 L3_pack_ccmodbus_92(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) { - U8 bufsize = 4; + U8 bufsize = 7; pmodbus->slaver = slaverId; - pmodbus->oper = MODBUS_OPER_WRITE; - pmodbus->buf[0] = reg >> 8 & 0xFF; - pmodbus->buf[1] = reg >> 0 & 0xFF; - pmodbus->buf[2] = buf[0]; - pmodbus->buf[3] = buf[1]; + pmodbus->oper = MODBUS_OPER_PING; crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); pmodbus->buf[bufsize] = pmodbus->crc[0]; pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; @@ -119,36 +122,11 @@ U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) return bufsize + 2 + 2; } -U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) -{ - U8 bufsize = 5,i = 0; - pmodbus->slaver = slaverId; - pmodbus->oper = MODBUS_OPER_WRITE_M; - pmodbus->buf[0] = reg >> 8 & 0xFF; - pmodbus->buf[1] = reg >> 0 & 0xFF; - pmodbus->buf[2] = num >> 8 * 0xFF; - pmodbus->buf[3] = num >> 0 & 0xFF; - pmodbus->buf[4] = bytes; - - for(i=0;ibuf[5+i] = buf[i]; - } - crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); - pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; - pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; - - return bufsize + bytes + 2 + 2; -} - -#if 0 - -U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info) +U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info) { + U8 pkglen = 0; pccmodbus->filter1 = D_CMD_Filter1_ff; pccmodbus->filter2 = D_CMD_Filter2_fe; - pccmodbus->num = L3_pack_modbus((TS_PH4_modbus*)&pccmodbus->slaver, slaver_info); - switch(slaver_info->oper) { case MODBUS_OPER_READ: @@ -157,17 +135,21 @@ U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info) case MODBUS_OPER_WRITE: pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); break; - case MODBUS_OPER_WRITE_M: - pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + case MODBUS_OPER_WRITE_M://组包时加extra_num + pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf,slaver_info->extra_num); + break; + case MODBUS_OPER_AUTH: + pkglen = L3_pack_ccmodbus_90(pccmodbus,slaver_info->slaver); + break; + case MODBUS_OPER_PING: + pkglen = L3_pack_ccmodbus_92(pccmodbus,slaver_info->slaver); break; default: break; } pccmodbus->num = pkglen; - - return pccmodbus->num + 3; + return pkglen + 3; } -#endif U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck) { @@ -186,8 +168,8 @@ 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_Handle_PH3 *p)// reentrant +{ p->cashe[1] = p->cashe[0]; p->cashe[0] = p->reg;// @@ -195,66 +177,47 @@ void L1_s2b_PH3(struct _tp_handler_x *p)// reentrant { if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) { + LED1 ^= 1; p->head = 1; - p->max = D_TPC_HANDLER_X_LEN ; - p->sp = p->buf; - p->num = 0; - p->sp[p->num++] = p->head_0; - p->sp[p->num++] = p->head_1; + p->max = D_s_PH3_ccmodbus_max - 1; + p->sp = (unsigned char *)&(p->ts_ccmodbus); + p->sp[0] = p->head_0; + p->sp[1] = p->head_1; + p->num = 1; + //p->ok = 1; } } + else { - p->sp[p->num++] = p->cashe[0]; - if(p->num == 3)//数量 第3个数据 + p->num ++; + p->sp[p->num] = p->cashe[0]; + if(p->num == 2)//数量 第3个数据 { - p->max = p->cashe[0] + 3; - if((p->max > D_TPC_HANDLER_X_LEN ) || (p->max < D_s_ccmodbus_min)) + p->max = p->reg + 2;// + if(p->max >= D_s_PH3_ccmodbus_max) { - p->head = 0; - return; //error 超过最大长度 + p->max = D_s_PH3_ccmodbus_max - 1; + p->sp[p->num] = p->max - 2; } } if(p->num >= p->max) { - crc16(p->crc,p->buf + 3,p->num - 3 - 2); - if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + //crc16(p->crc,&p->ts_ccmodbus.slaver,p->ts_ccmodbus.num - 2); + //if(p->crc[0] == p->sp[p->num-1] && p->crc[1] == p->sp[p->num]) + if(1) { if (p->ok != 1) { + //byte_copy_uc((U8*)&p->ts_ccmodbus,(U8*)&p->__ts_ccmodbus,p->max + 1); p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 } } + p->num = 0; //放在if (p->ok != 1) 外 p->head = 0; //放在if (p->ok != 1) 外 } } -} -U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info) -{ - U8 pkglen = 0; - pccmodbus->filter1 = D_CMD_Filter1_ff; - pccmodbus->filter2 = D_CMD_Filter2_fe; - switch(slaver_info->oper) - { - case MODBUS_OPER_READ: - pkglen = L3_pack_ccmodbus_03(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); - break; - case MODBUS_OPER_WRITE: - pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); - break; - case MODBUS_OPER_WRITE_M: - pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); - break; - - default: - break; - } - pccmodbus->num = pkglen; - return pkglen + 3; } - -/****************************************************************************** -** End Of File -******************************************************************************/ +/******************************************************************************/ diff --git a/source/tpc/ccmodbus.h b/source/tpc/ccmodbus.h index 1e59882..9130a0a 100644 --- a/source/tpc/ccmodbus.h +++ b/source/tpc/ccmodbus.h @@ -50,11 +50,11 @@ msp/uartx.c 底层代码 和cpu相关 -#ifndef __TPC_CCMODBUS_H_ -#define __TPC_CCMODBUS_H_ - -#include "tpc_x.h" -#include "modbus.h" +#ifndef __CCMODBUS_H_ +#define __CCMODBUS_H_ +#include "../clib/type.h" +#include "../tpc/tpc_x.h" +//#include "../app/app_config.h" //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> /// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议 @@ -64,8 +64,9 @@ msp/uartx.c 底层代码 和cpu相关 #define D_s_PH3_ccmodbus_max 128 #define D_s_ccmodbus_min (D_s_modbus_min + 3) -extern vU8 D_CMD_Filter1_ff; -extern vU8 D_CMD_Filter2_fe; +#define D_CMD_Filter1_ff 0xFF +#define D_CMD_Filter2_fe 0xFE + typedef struct {//8byte vU8 filter1; @@ -89,7 +90,7 @@ typedef struct vU8 head; //接收标志头标志 vU8 ok; //接收协议ok标志 vU8 num; - vU8 *sp; + vU8 *sp; TS_PH3_ccmodbus ts_ccmodbus; vU8 crc[2]; }TS_Handle_PH3; @@ -103,13 +104,13 @@ typedef struct U16 bytes; U8 *buf; U16 mask; + U16 extra_num; }CCMD_SLAVER_INFO; - -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 U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_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(TS_Handle_PH3 *p);// reentrant; #endif /* end __TPC_CCMODBUS_H_ */ diff --git a/source/tpc/modbus.c b/source/tpc/modbus.c index f858244..84c5189 100644 --- a/source/tpc/modbus.c +++ b/source/tpc/modbus.c @@ -30,10 +30,188 @@ msp/uartx.c 底层代码 和cpu相关 ********************************************************************************/ #include "modbus.h" +#include "../app/app_config.h" #include "../bsp/bsp_config.h" #include "../ctask/tick.h" #include "../clib/clib.h" + +U8 L3_pack_modbus_03(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} + +U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) +{ + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + case MODBUS_OPER_WRITE: + return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + case MODBUS_OPER_WRITE_M: + return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + default: + return 0; + } +} + +U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) +{ + pmodbus->slaver = slaver; + pmodbus->oper = oper; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +//MODBUS从设备数据处理函数 +static Modbus03Ack *pModbus03Ack; +static Modbus06Ack *pModbus06Ack; +static Modbus10Ack *pModbus10Ack; +static U16 modbuslen = 0,reg,num,val,count; +U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U16 i = 0,j = 0,regval = 0; + pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 + { + for(i=0; ibuf[j++] = regval >> 8 & 0xFF; + pModbus03Ack->buf[j++] = regval & 0xFF; + } + pModbus03Ack->bytes = num * 2; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); + } + break; + } +#if 0 + case MODBUS_OPER_WRITE: + { + pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if(reg <= sizeof(R)/2) + { + *(REG_2_MEM(reg)) = val; + pModbus06Ack->reg = reg; + pModbus06Ack->val = *(REG_2_MEM(reg)); + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } +#endif + case MODBUS_OPER_WRITE_M: + { + U16 i = 0; + pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + count = pmodbus->buf[4]; + if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 + { + for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); + } + pModbus10Ack->reg = reg; + pModbus10Ack->num = num; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + default:break; + } + return modbuslen; +} + +//MODBUS主设备轮询时,从设备返回数据处理函数 +//MD_SLAVER_INFO需要被正确定义 +void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U8 i = 0; + for(i=0;ibuf[0];i++) + { + //此处假设字节序一致 + p_slaver_info->buf[i] = pmodbus->buf[i + 1]; + //TODO 字节序不一致时的处理 + } + break; + } + case MODBUS_OPER_WRITE: + case MODBUS_OPER_WRITE_M: + default: break; + } +} + + + + //MODBUS协议解析函数 //超出D_tp_handle_x_len,不继续保存数据 void L1_s2b_PH4(struct _tp_handler_x *p) diff --git a/source/tpc/modbus.h b/source/tpc/modbus.h index 47222cf..5389a00 100644 --- a/source/tpc/modbus.h +++ b/source/tpc/modbus.h @@ -38,6 +38,8 @@ enum MODBUS_OPER MODBUS_OPER_WRITE = 0x06, MODBUS_OPER_WRITE_M = 0x10, MODBUS_OPER_ERR = 0x8F, + MODBUS_OPER_AUTH = 0x90, + MODBUS_OPER_PING = 0x92, }; //协议类型: MODBUS RTU模式