Browse Source

修正串口

bfysop-v2
mr.zhangsan 1 year ago
parent
commit
69878586ee
  1. 5
      source/.vscode/settings.json
  2. 15
      source/app/main.c
  3. 4
      source/app/task_debug.c
  4. 26
      source/app/task_modbus.c
  5. 2
      source/app/task_modbus.h
  6. 4
      source/bsp/bsp_config.h
  7. 2
      source/ctask/task.c
  8. 68
      source/msp/UART0.C
  9. 4
      source/msp/UART0.h
  10. 18
      source/msp/UART2.c
  11. 3
      source/msp/UART2.h
  12. 37
      source/msp/UART3.c
  13. 4
      source/msp/UART3.h
  14. 23
      source/msp/UART4.C
  15. 3
      source/msp/UART4.h
  16. 114
      source/msp/time.c
  17. 31
      source/msp/uart_x.h
  18. 2
      source/tpc/0d0a.c
  19. 2
      source/tpc/0d0a.h
  20. 2
      source/tpc/ccmodbus.c
  21. 2
      source/tpc/ccmodbus.h
  22. 15
      source/tpc/debug.c
  23. 4
      source/tpc/debug.h
  24. 4
      source/tpc/modbus.c
  25. 4
      source/tpc/modbus.h
  26. 18
      source/tpc/tpc_x.h

5
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"
}
}

15
source/app/main.c

@ -133,19 +133,28 @@ 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();
//单路采集滤波

4
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();

26
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);
// }
// }
}

2
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

4
source/bsp/bsp_config.h

@ -228,12 +228,12 @@
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG
#define SERIAL_MAX_NUM 1
#define SERIAL_MAX_NUM 4
////fixme:和cpu的程序容量息息相关
#define D_UART_send_buf_max 16 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms
/// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms
/// 128Bytes = 128*0.5ms = 64ms
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG End

2
source/ctask/task.c

@ -61,7 +61,7 @@ void L2_task_voice_handle(struct _s_task_music_ *s)
{
s->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;

68
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();
}

4
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

18
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发送中断
{

3
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

37
source/msp/UART3.c

@ -58,9 +58,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面
#include "time.h"
#include <stdio.h>
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();
}

4
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

23
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); //打开串口中断

3
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

114
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*********************************/

31
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];

2
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)
{

2
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

2
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;//

2
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_ */

15
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))

4
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_ */
/*****************************************************************************

4
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)
{

4
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_ */

18
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

Loading…
Cancel
Save