/****************************************************************************************************** 1、北斗协议和GPS协议不一样,不是以"\r\n"为一条协议的结束. 2、printf函数中的打印信息是const字符串常量,放在cpu内部flash,北斗模块printf打印过多,导致scanf("%s",payload);输入的内容被改写. 3、协议发送时不要使用结构体表示发送内容,接收时可以使用结构体表示接收内容. 4、调试协议时使用串口监视工具AccessPort进行串口协议抓包. 5、Msp430F5438:RAM(16KB),内部flash(256KB + 256B),4个串口. 6、注意北斗协议净荷封装的是RTU的协议,由于RTU协议也是以'$'符号位为协议的开始,因此需要进行转义,本程序以'M'替代净荷中的'$'. 7、Created by xumin,2015-05-20,copyright is reserved. ******************************************************************************************************/ #include "..\..\include\includes.h" #ifdef DEF_COMPILE_PROJECT_APP #ifdef BD_COMM_SUPPORT unsigned char bd_buf_bitmap = 0; //unsigned char dwxx_buf[todo]; unsigned char txxx_buf[TXXX_MAX_SIZE]; unsigned char icxx_buf[ICXX_FIRM_SIZE]; unsigned char zjxx_buf[ZJXX_FIRM_SIZE]; //unsigned char sjxx_buf[todo]; //unsigned char bbxx_buf[todo]; unsigned char fkxx_buf[FKXX_FIRM_SIZE]; unsigned int rx_packet_len = 0; unsigned char bd_rx_char; unsigned int bd_buf_pointer = 0; unsigned char bd_shared_rx_buf[RX_BD_MAX_DATA_SIZE]; unsigned char g_src_user_addr[3]; unsigned char g_dst_user_addr[3]; unsigned char g_transfer_format; void init_uart3_for_bd() { #if 1 //波特率115200配置 P10SEL |= BIT4 + BIT5; UCA3CTL1 |= UCSWRST; //USCI状态机复位 UCA3CTL1 |= UCSSEL_2; //SMCLK UCA3BR0 = 69; //115200 UCA3BR1 = 0x00; UCA3MCTL = 0x06; //波特率微调 UCA3CTL1 &= ~UCSWRST; //初始化USCI状态机 UCA3IE |= UCRXIE; //使能BD串口RX中断 #else //波特率9600配置 P10SEL |= BIT4+BIT5; UCA3CTL1 |= UCSWRST;//USCI状态机复位 UCA3CTL1 |= UCSSEL_1;//ACLK UCA3BR0 = 0x03;//9600 UCA3BR1 = 0x00; UCA3MCTL = 0x06;//波特率微调 UCA3CTL1 &= ~UCSWRST;//初始化USCI状态机 UCA3IE |= UCRXIE; //使能BD串口RX中断 #endif } /* 异或校验和算法 */ static unsigned char xor_checksum (unsigned char *buf, unsigned int len) { unsigned int i; unsigned char checksum = 0; for (i = 0; i < len; ++i) { checksum ^= *(buf++); } return checksum; } void tx_uart3_char(unsigned char c) { while (!(UCA3IFG & UCTXIFG)); UCA3TXBUF = c; } void tx_uart3_string(unsigned char *str, unsigned int len) { unsigned int i; for (i = 0 ; i < len; ++i) { tx_uart3_char(*(str + i)); } } void create_txsq(unsigned char *src_user_addr, unsigned char *dst_user_addr, unsigned char transfer_format, unsigned char *payload, unsigned int payload_len, unsigned char *send_txsq_data) { /* 1、通信申请指令初始化,不采用memcpy等库函数,提高指令执行效率,只有涉及到大量数据赋值拷贝时才考虑用库函数 */ send_txsq_data[0] = '$'; send_txsq_data[1] = 'T'; send_txsq_data[2] = 'X'; send_txsq_data[3] = 'S'; send_txsq_data[4] = 'Q'; /* 2、包长度,先传高位,再传低位 */ send_txsq_data[5] = (TXSQ_FIRM_SIZE + payload_len) / 256; send_txsq_data[6] = (TXSQ_FIRM_SIZE + payload_len) % 256; /* 3、源用户地址 */ send_txsq_data[7] = *src_user_addr; send_txsq_data[8] = *(src_user_addr + 1); send_txsq_data[9] = *(src_user_addr + 2); /* 4.1、信息-信息类别 */ if (transfer_format == 0) //汉字 { send_txsq_data[10] = TXSQ_PAYLOAD_CHINESE;//0b01000100; } else //代码/混发 { send_txsq_data[10] = TXSQ_PAYLOAD_BCD;//0b01000110; } /* 4.2、信息-目的用户地址 */ send_txsq_data[11] = *dst_user_addr; send_txsq_data[12] = *(dst_user_addr + 1); send_txsq_data[13] = *(dst_user_addr + 2); /* 4.3、信息-电文净荷长度-单位是bit */ send_txsq_data[14] = (payload_len * 8) / 256; send_txsq_data[15] = (payload_len * 8) % 256; /* 4.4、信息-是否应答 */ send_txsq_data[16] = 0; /* 4.5、信息-电文内容 */ memcpy(&send_txsq_data[17] , payload, payload_len); /* 5、校验和 */ send_txsq_data[TXSQ_FIRM_SIZE + payload_len -1] = xor_checksum(send_txsq_data, (TXSQ_FIRM_SIZE + payload_len -1)); printf("\r\n xor_checksum = 0x%x\r\n", xor_checksum(send_txsq_data, (TXSQ_FIRM_SIZE + payload_len -1))); } void send_dwsq() { //todo } /* 1、结构体不宜管理可变长度的数据协议,如通讯申请协议 2、发送长度为6个字节("我爱你"),发送方式为中文,协议内容: txsq:24 54 58 53 51 00 18 02 ad f7 44 02 ad f7 00 30 00 ce d2 b0 ae c4 e3 63 txxx:24 54 58 58 58 00 1a 02 ad f7 40 02 ad f7 00 00 00 30 ce d2 b0 ae c4 e3 00 67 */ void send_txsq(unsigned char cmd, unsigned char *src_user_addr, unsigned char *dst_user_addr, unsigned char transfer_format, unsigned char *send_txsq_payload, unsigned int send_txsq_payload_len) { unsigned int i; unsigned char l_transfer_format; unsigned int payload_len; unsigned long src_user_addr_long; unsigned long dst_user_addr_long; unsigned char l_src_user_addr[3]; unsigned char l_dst_user_addr[3]; unsigned char payload[MAX_PAYLOAD_LEN]; unsigned char send_txsq_data[TXSQ_FIRM_SIZE + MAX_PAYLOAD_LEN]; if (cmd == 1) { UCA2IE &= ~UCRXIE; DebugPrintBd("\r\n 输入十六进制用户地址(如02adf7,02adfb):"); scanf("%lx", &src_user_addr_long); DebugPrintBd("\r\n 输入十六进制目的用户地址(如02adf7,02adfb):"); scanf("%lx", &dst_user_addr_long); DebugPrintBd("\r\n 内容编码(0:汉字,1代码):"); scanf("%d",&l_transfer_format); #if 1 DebugPrintBd("\r\n 发送内容:"); scanf("%s", payload); payload_len = strlen((char const *)payload); #else DebugPrintBd("\r\n 输入发送内容长度:"); scanf("%d", &payload_len); //payload_len = 78; for (i = 0; i < payload_len; ++i) { payload[i] = 0x5a; } #endif UCA2IE |= UCRXIE; l_src_user_addr[0] = src_user_addr_long / 65536; l_src_user_addr[1] = (src_user_addr_long % 65536) / 256; l_src_user_addr[2] = (src_user_addr_long % 65536) % 256; l_dst_user_addr[0] = dst_user_addr_long / 65536; l_dst_user_addr[1] = (dst_user_addr_long % 65536) / 256; l_dst_user_addr[2] = (dst_user_addr_long % 65536) % 256; for (i = 0; i < 3; ++i) { g_src_user_addr[i] = l_src_user_addr[i]; g_dst_user_addr[i] = l_src_user_addr[i]; } g_transfer_format = l_transfer_format; create_txsq(l_src_user_addr, l_dst_user_addr, l_transfer_format, payload, payload_len, send_txsq_data); tx_uart3_string(send_txsq_data, (TXSQ_FIRM_SIZE + payload_len)); } else { create_txsq(src_user_addr, dst_user_addr, transfer_format, send_txsq_payload, send_txsq_payload_len, send_txsq_data); tx_uart3_string(send_txsq_data, (TXSQ_FIRM_SIZE + send_txsq_payload_len)); } } void send_cksc() { //todo } /* 1、IC检测协议内容: icjc:24 49 43 4A 43 00 0C 00 00 00 00 2B icxx:24 49 43 58 58 00 16 02 AD F7 00 00 00 0B 06 00 3C 03 00 00 00 52 */ void send_icjc() { unsigned char send_icjc_data[XTZJ_FIRM_SIZE]; send_icjc_data[0] = '$'; send_icjc_data[1] = 'I'; send_icjc_data[2] = 'C'; send_icjc_data[3] = 'J'; send_icjc_data[4] = 'C'; send_icjc_data[5] = ICJC_FIRM_SIZE / 256; //先传高位 send_icjc_data[6] = ICJC_FIRM_SIZE % 256; //再传低位 send_icjc_data[7] = 0x00; send_icjc_data[8] = 0x00; send_icjc_data[9] = 0x00; send_icjc_data[10] = 0x00; send_icjc_data[11] = xor_checksum(send_icjc_data, (XTZJ_FIRM_SIZE - 1)); tx_uart3_string(send_icjc_data, XTZJ_FIRM_SIZE); } /* 1、XTZJ协议内容: xtzj:24 58 54 5A 4A 00 0D 02 AD FB 00 00 61 zjxx:24 5a 4a 58 58 00 15 02 AD FB 01 00 64 02 00 00 03 00 02 00 13 */ void send_xtzj() { unsigned long user_addr; unsigned int frequency; unsigned char send_xtzj_data[XTZJ_FIRM_SIZE]; UCA2IE &= ~UCRXIE; DebugPrintBd("\r\n 输入十六进制用户地址(如02adf7):"); scanf("%lx", &user_addr); DebugPrintBd("\r\n 输入系统自检的频度:"); scanf("%d", &frequency); UCA2IE |= UCRXIE; send_xtzj_data[0] = '$'; send_xtzj_data[1] = 'X'; send_xtzj_data[2] = 'T'; send_xtzj_data[3] = 'Z'; send_xtzj_data[4] = 'J'; send_xtzj_data[5] = XTZJ_FIRM_SIZE / 256; //先传高位 send_xtzj_data[6] = XTZJ_FIRM_SIZE % 256; //再传低位 send_xtzj_data[7] = user_addr / 65536; send_xtzj_data[8] = (user_addr % 65536) / 256; send_xtzj_data[9] = (user_addr % 65536) % 256; send_xtzj_data[10] = frequency / 256; send_xtzj_data[11] = frequency % 256; send_xtzj_data[12] = xor_checksum(send_xtzj_data, XTZJ_FIRM_SIZE-1); tx_uart3_string(send_xtzj_data, XTZJ_FIRM_SIZE); } void send_sjsc() { //todo } void send_bbdq() { //todo } void parse_txxx(struct txxx_struct *txxx) { unsigned int i; unsigned int payload_len; unsigned char send_data[104];//用途有2 /* 1、指令内容 */ for (i = 0; i < 5; ++i) { (*txxx).instruction[i] = txxx_buf[i]; } /* 2、接收包长 */ (*txxx).packet_len = txxx_buf[5] * 256 + txxx_buf[6]; /* 3、目的用户地址 */ for (i = 0; i < 3; ++i) { (*txxx).user_addr[i] = txxx_buf[i + 7]; } /* 4.1、信息-信息类别 */ memcpy(&((*txxx).txxx_info.txxx_info_type), (txxx_buf + 10), 1); /* 4.2、信息-发送方地址 */ for (i = 0; i < 3; ++i) { (*txxx).txxx_info.src_user_addr[i] = txxx_buf[i + 11]; } /* 4.3、信息-发送时间 */ (*txxx).txxx_info.send_time.hour = txxx_buf[14]; (*txxx).txxx_info.send_time.minute = txxx_buf[15]; /* 4.4、信息-电文长度 */ (*txxx).txxx_info.payload_len = txxx_buf[16] * 256 + txxx_buf[17]; payload_len = (*txxx).txxx_info.payload_len / 8; /* 4.5、信息-电文内容 */ memcpy((*txxx).txxx_info.payload, (txxx_buf + 18), payload_len); /* 4.6、信息-CRC */ (*txxx).txxx_info.crc = txxx_buf[18 + payload_len]; /* 5、校验和 */ (*txxx).checksum = txxx_buf[18 + payload_len + 1]; if ((txxx_buf[18] == 'z') && (txxx_buf[19] == 't')/* (txxx_buf[18] == 'z') && (txxx_buf[19] == 't') && (txxx_buf[20] == 'c') && (txxx_buf[20] == 'x') */) { #if 1 create_send_data_1(send_data); send_txsq(0, &(*txxx).user_addr[0], &(*txxx).txxx_info.src_user_addr[0], g_transfer_format, send_data, (104-37)); #else for (i = 0; i < (104-37); ++i) { send_data[i] = 0x5a; } send_data[0] = 'M'; send_data[1] = (104-37); send_txsq(0, &(*txxx).user_addr[0], &(*txxx).txxx_info.src_user_addr[0], g_transfer_format, send_data, (104-37)); #endif }else if ( (txxx_buf[18] == 'M') && (txxx_buf[19] == (104-37)) ) { create_send_data_2(send_data, &txxx_buf[18], payload_len); SendData(104, 1, GSMNEW_ENUM_measureCurSend, send_data); } } void parse_icxx(struct icxx_struct *icxx) { unsigned int i; for (i = 0; i < 5; ++i) { (*icxx).instruction[i] = icxx_buf[i]; } (*icxx).packet_len = icxx_buf[5] * 256 + icxx_buf[6]; for (i = 0; i < 3; ++i) { (*icxx).user_addr[i] = icxx_buf[i + 7]; } (*icxx).icxx_info.frame_id = icxx_buf[10]; for (i = 0; i < 3; ++i) { (*icxx).icxx_info.broadcast_id[i] = icxx_buf[i + 11]; } (*icxx).icxx_info.user_feature = icxx_buf[14]; (*icxx).icxx_info.service_frequency = icxx_buf[15] * 256 + icxx_buf[16]; (*icxx).icxx_info.comm_level = icxx_buf[17]; (*icxx).icxx_info.encryption_flag = icxx_buf[18]; (*icxx).icxx_info.user_num = icxx_buf[19] * 256 + icxx_buf[20]; (*icxx).checksum = icxx_buf[21]; } void parse_zjxx(struct zjxx_struct *zjxx) { unsigned int i; for (i = 0; i < 5; ++i) { (*zjxx).instruction[i] = zjxx_buf[i]; } (*zjxx).packet_len = zjxx_buf[5] * 256 + zjxx_buf[6]; for (i = 0; i < 3; ++i) { (*zjxx).user_addr[i] = zjxx_buf[i + 7]; } (*zjxx).zjxx_info.ic_status = zjxx_buf[10]; (*zjxx).zjxx_info.hw_status = zjxx_buf[11]; (*zjxx).zjxx_info.battery_quantity = zjxx_buf[12]; (*zjxx).zjxx_info.in_station_status = zjxx_buf[13]; for (i = 0; i < 6; ++i) { (*zjxx).zjxx_info.power_status[i] = zjxx_buf[14 + i]; } (*zjxx).checksum = zjxx_buf[20]; } void parse_fkxx(struct fkxx_struct *fkxx) { unsigned int i; for (i = 0; i < 5; ++i) { (*fkxx).instruction[i] = fkxx_buf[i]; } (*fkxx).packet_len = fkxx_buf[5] * 256 + fkxx_buf[6]; for (i = 0; i < 3; ++i) { (*fkxx).user_addr[i] = fkxx_buf[i + 7]; } (*fkxx).fkxx_info.fk_flag = fkxx_buf[10]; for (i = 0; i < 4; ++i) { (*fkxx).fkxx_info.extra_info[i] = fkxx_buf[11 + i]; } (*fkxx).checksum = fkxx_buf[15]; } void print_txxx(struct txxx_struct *txxx) { unsigned int i; Tx_monitor_S("\r\n ========= TXXX包-打印开始=========\r\n"); DebugPrintBd("\r\n TXXX包总长度:%d", (*txxx).packet_len); DebugPrintBd("\r\n TXXX包用户地址:0x%02x%02x%02x", (*txxx).user_addr[0], (*txxx).user_addr[1], (*txxx).user_addr[2]); DebugPrintBd("\r\n TXXX包信息内容-发送方地址:0x%02x%02x%02x", (*txxx).txxx_info.src_user_addr[0], (*txxx).txxx_info.src_user_addr[1], (*txxx).txxx_info.src_user_addr[2]); DebugPrintBd("\r\n TXXX包信息内容-发送时间:%02d时%02d分", (*txxx).txxx_info.send_time.hour, (*txxx).txxx_info.send_time.minute); DebugPrintBd("\r\n TXXX包信息内容-电文长度:%d字节", (*txxx).txxx_info.payload_len / 8); DebugPrintBd("\r\n TXXX包信息内容-电文内容:"); for (i = 0; i < ((*txxx).txxx_info.payload_len / 8); ++i) { DebugPrintBd("%02x ", (*txxx).txxx_info.payload[i]); } DebugPrintBd("\r\n TXXX包信息内容-CRC:0x%02x", (*txxx).txxx_info.crc); DebugPrintBd("\r\n TXXX包校验和:0x%02x", (*txxx).checksum); DebugPrintBd("\r\n ========= TXXX包-打印结束=========\r\n"); } void print_icxx(struct icxx_struct *icxx) { Tx_monitor_S("\r\n ========= ICXX包-打印开始=========\r\n"); DebugPrintBd("\r\n ICXX包总长度:%d", (*icxx).packet_len); DebugPrintBd("\r\n ICXX包用户地址:0x%02x%02x%02x", (*icxx).user_addr[0], (*icxx).user_addr[1], (*icxx).user_addr[2]); DebugPrintBd("\r\n ICXX信息内容-帧号:%d", (*icxx).icxx_info.frame_id); DebugPrintBd("\r\n ICXX信息内容-通播ID:0x%02x%02x%02x", (*icxx).icxx_info.broadcast_id[0], (*icxx).icxx_info.broadcast_id[1], (*icxx).icxx_info.broadcast_id[2]); DebugPrintBd("\r\n ICXX信息内容-用户特征:%d", (*icxx).icxx_info.user_feature); DebugPrintBd("\r\n ICXX信息内容-服务频度:%d秒", (*icxx).icxx_info.service_frequency); DebugPrintBd("\r\n ICXX信息内容-通信级别:%d", (*icxx).icxx_info.comm_level); DebugPrintBd("\r\n ICXX信息内容-加密标志:%d", (*icxx).icxx_info.encryption_flag); DebugPrintBd("\r\n ICXX信息内容-用户数目:%d", (*icxx).icxx_info.user_num); DebugPrintBd("\r\n ICXX包校验和:0x%02x\r\n", (*icxx).checksum); DebugPrintBd("\r\n ========= ICXX包-打印结束=========\r\n"); } void print_zjxx(struct zjxx_struct *zjxx) { Tx_monitor_S("\r\n ========= ZJXX包-打印开始=========\r\n"); DebugPrintBd("\r\n ZJXX包总长度:%d", (*zjxx).packet_len); DebugPrintBd("\r\n ZJXX包用户地址:0x%02x%02x%02x", (*zjxx).user_addr[0], (*zjxx).user_addr[1], (*zjxx).user_addr[2]); DebugPrintBd("\r\n ZJXX信息内容-IC卡状态:0x%02x", (*zjxx).zjxx_info.ic_status); DebugPrintBd("\r\n ZJXX信息内容-硬件状态:0x%02x", (*zjxx).zjxx_info.hw_status); DebugPrintBd("\r\n ZJXX信息内容-电池电量:0x%02x", (*zjxx).zjxx_info.battery_quantity); DebugPrintBd("\r\n ZJXX信息内容-入站状态:0x%02x", (*zjxx).zjxx_info.in_station_status); DebugPrintBd("\r\n ZJXX信息内容-功率状态:%d-%d-%d-%d-%d-%d", (*zjxx).zjxx_info.power_status[0], (*zjxx).zjxx_info.power_status[1], (*zjxx).zjxx_info.power_status[2], (*zjxx).zjxx_info.power_status[3],(*zjxx).zjxx_info.power_status[4], (*zjxx).zjxx_info.power_status[5]); DebugPrintBd("\r\n ZJXX包校验和:0x%02x\r\n", (*zjxx).checksum); DebugPrintBd("\r\n ========= ZJXX包-打印结束=========\r\n"); } void print_fkxx(struct fkxx_struct *fkxx) { Tx_monitor_S("\r\n ========= FKXX包-打印开始=========\r\n"); DebugPrintBd("\r\n FKXX包总长度:%d", (*fkxx).packet_len); DebugPrintBd("\r\n FKXX包用户地址:0x%02x%02x%02x", (*fkxx).user_addr[0], (*fkxx).user_addr[1], (*fkxx).user_addr[2]); DebugPrintBd("\r\n FKXX信息内容-反馈标志:0x%02x", (*fkxx).fkxx_info.fk_flag); DebugPrintBd("\r\n FKXX信息内容-附加信息:0x%02x-0x%02x-0x%02x-0x%02x", (*fkxx).fkxx_info.extra_info[0], (*fkxx).fkxx_info.extra_info[1], (*fkxx).fkxx_info.extra_info[2], (*fkxx).fkxx_info.extra_info[3]); DebugPrintBd("\r\n FKXX包校验和:0x%02x\r\n", (*fkxx).checksum); DebugPrintBd("\r\n ========= FKXX包-打印结束=========\r\n"); } void read_bd_rx_info(void) { struct txxx_struct txxx; struct icxx_struct icxx; struct zjxx_struct zjxx; struct fkxx_struct fkxx; if (bd_buf_bitmap & FKXX_BUF) { parse_fkxx(&fkxx); print_fkxx(&fkxx); bd_buf_bitmap &= ~FKXX_BUF; } if (bd_buf_bitmap & ICXX_BUF) { parse_icxx(&icxx); print_icxx(&icxx); bd_buf_bitmap &= ~ICXX_BUF; } if (bd_buf_bitmap & ZJXX_BUF) { parse_zjxx(&zjxx); print_zjxx(&zjxx); bd_buf_bitmap &= ~ZJXX_BUF; } if (bd_buf_bitmap & TXXX_BUF) { parse_txxx(&txxx); print_txxx(&txxx); bd_buf_bitmap &= ~TXXX_BUF; } } void copy_packet_from_shared_buf() { if ((bd_shared_rx_buf[1] == 'D') && (bd_shared_rx_buf[2] == 'W')) //收到定位信息$DWXX { bd_buf_bitmap |= DWXX_BUF; //memcpy(dwxx_buf, bd_shared_rx_buf, sizeof(dwxx_buf)); } else if ((bd_shared_rx_buf[1] == 'T') && (bd_shared_rx_buf[2] == 'X')) //收到通信信息$TXXX { bd_buf_bitmap |= TXXX_BUF; memcpy(txxx_buf, bd_shared_rx_buf, sizeof(txxx_buf)); } else if ((bd_shared_rx_buf[1] == 'I') && (bd_shared_rx_buf[2] == 'C')) //收到IC信息$ICXX { bd_buf_bitmap |= ICXX_BUF; memcpy(icxx_buf, bd_shared_rx_buf, sizeof(icxx_buf)); } else if ((bd_shared_rx_buf[1] == 'Z') && (bd_shared_rx_buf[2] == 'J')) //收到自检信息$ZJXX { bd_buf_bitmap |= ZJXX_BUF; memcpy(zjxx_buf, bd_shared_rx_buf, sizeof(zjxx_buf)); } else if ((bd_shared_rx_buf[1] == 'S') && (bd_shared_rx_buf[2] == 'J')) //收到时间信息$SJXX { bd_buf_bitmap |= SJXX_BUF; //memcpy(sjxx_buf, bd_shared_rx_buf, sizeof(sjxx_buf)); } else if ((bd_shared_rx_buf[1] == 'B') && (bd_shared_rx_buf[2] == 'B')) //收到版本信息$BBXX { bd_buf_bitmap |= BBXX_BUF; //memcpy(bbxx_buf, bd_shared_rx_buf, sizeof(bbxx_buf)); } else if ((bd_shared_rx_buf[1] == 'F') && (bd_shared_rx_buf[2] == 'K')) //收到反馈信息$FKXX { bd_buf_bitmap |= FKXX_BUF; memcpy(fkxx_buf, bd_shared_rx_buf, sizeof(fkxx_buf)); } } #pragma vector=USCI_A3_VECTOR __interrupt void USCI_A3_ISR(void) { unsigned int iv_temp; _DINT(); PUSHALL iv_temp = UCA3IV; iv_temp = iv_temp % 16; if ((iv_temp & 0x02) != 0) { bd_rx_char = UCA3RXBUF; if (bd_rx_char == '$') //开始接收报文 { bd_buf_pointer = 0; } bd_shared_rx_buf[bd_buf_pointer] = bd_rx_char; if (bd_buf_pointer == 6)//接收到报文中长度字段的第2个字节 { rx_packet_len = bd_shared_rx_buf[5] * 256 + bd_shared_rx_buf[6]; } else if (bd_buf_pointer == (rx_packet_len - 1)) //接收到报文最后一个字节 { copy_packet_from_shared_buf(); } if (bd_buf_pointer != (rx_packet_len - 1)) { bd_buf_pointer = (bd_buf_pointer + 1) % RX_BD_MAX_DATA_SIZE; //指针自增 } else { bd_buf_pointer = 0; //收到最后一个字节后 } } POPALL _EINT(); } #endif #endif #ifndef __APPBD_H__ #define __APPBD_H__ #define MAX_PAYLOAD_LEN 210 //即(1680/8) #define INSTRUCTION_SIZE 5 #define PACKET_LEN_SIZE 2 #define USER_ADDR_SIZE 3 #define CHECKSUM_SIZE 1 #define IPUC (INSTRUCTION_SIZE + PACKET_LEN_SIZE + USER_ADDR_SIZE + CHECKSUM_SIZE) #define TXSQ_INFO_FIRM_SIZE 7 //即(1 个信息类别 + 3 个用户地址 + 2个电文长度 + 1个应答字节) #define TXSQ_FIRM_SIZE (IPUC + TXSQ_INFO_FIRM_SIZE) #define ICJC_INFO_FIRM_SIZE 1 //即帧号,占一个字节 #define ICJC_FIRM_SIZE (IPUC + ICJC_INFO_FIRM_SIZE) #define XTZJ_INFO_FIRM_SIZE 2 //即自检频度,占二个字节 #define XTZJ_FIRM_SIZE (IPUC + XTZJ_INFO_FIRM_SIZE) #define ICXX_INFO_FIRM_SIZE 11 //即(1个帧号+3个通播ID+1个用户特征+2个服务频度+1个通信等级+1个加密标志+2个下属用户总数) #define ICXX_FIRM_SIZE (IPUC + ICXX_INFO_FIRM_SIZE) #define TXXX_INFO_FIRM_SIZE 9 //即(1个信息类别+3个发信方地址+2个发信时间+2个电文长度+1个CRC标志 #define TXXX_FIRM_SIZE (IPUC + TXXX_INFO_FIRM_SIZE) #define TXXX_MAX_SIZE (TXXX_FIRM_SIZE + MAX_PAYLOAD_LEN)//TXXX由固定长度和净长度构成 #define FKXX_INFO_FIRM_SIZE 5//即(1个反馈标志+4个附加信息) #define FKXX_FIRM_SIZE (IPUC + FKXX_INFO_FIRM_SIZE) #define ZJXX_INFO_FRIM_SIZE 10 //即(1个IC卡状态+1个硬件状态+1个电池电量+1个入站状态+6个功率状态) #define ZJXX_FIRM_SIZE (IPUC + ZJXX_INFO_FRIM_SIZE) #define RX_BD_MAX_DATA_SIZE TXXX_MAX_SIZE #define TXSQ_PAYLOAD_CHINESE 0x44 #define TXSQ_PAYLOAD_BCD 0x46 enum { DWXX_BUF = (1 << 0), TXXX_BUF = (1 << 1), ICXX_BUF = (1 << 2), ZJXX_BUF = (1 << 3), SJXX_BUF = (1 << 4), BBXX_BUF = (1 << 5), FKXX_BUF = (1 << 6), }; /* =================== RTU到用户机 ============================ */ /* 注意:因为发送协议中通信申请(txsq)协议有可变数据内容,使用结构体来表示时,因为要通过串口发送出去, 无法控制长度,所以发送协议不宜采用结构体表示! struct peri_to_user_struct { struct dwsq_struct dwsq; struct txsq_struct txsq; struct cksc_struct cksc; struct icjc_struct icjc; struct xtzj_struct xtzj; struct sjsc_struct sjsc; struct bbdq_struct bbdq; }; */ /* =================== 用户机到RTU ============================*/ /* 定位信息 */ struct dwxx_struct { unsigned int todo; }; /* 通信信息 */ struct txxx_info_type_struct { unsigned char packet_comm:2; unsigned char transfer_format:1; unsigned char ack:1; unsigned char comm_way:1; unsigned char has_key:1; unsigned char rest:2; }; struct send_time_struct { unsigned char hour; unsigned char minute; }; struct txxx_info_struct { struct txxx_info_type_struct txxx_info_type; unsigned char src_user_addr[3]; struct send_time_struct send_time; unsigned int payload_len; unsigned char payload[MAX_PAYLOAD_LEN]; unsigned char crc; }; struct txxx_struct { unsigned char instruction[5]; unsigned int packet_len; //解析结构体时以整形数据表示其长度 unsigned char user_addr[3]; struct txxx_info_struct txxx_info; unsigned char checksum; }; struct icxx_info_struct { unsigned char frame_id; unsigned char broadcast_id[3]; unsigned char user_feature; unsigned int service_frequency; unsigned char comm_level; unsigned char encryption_flag; unsigned int user_num; }; /* IC信息 */ struct icxx_struct { unsigned char instruction[5]; unsigned int packet_len; unsigned char user_addr[3]; struct icxx_info_struct icxx_info; unsigned char checksum; }; struct zjxx_info_struct { unsigned char ic_status; unsigned char hw_status; unsigned char battery_quantity; unsigned char in_station_status; unsigned char power_status[6]; }; struct zjxx_struct { unsigned char instruction[5]; unsigned int packet_len; unsigned char user_addr[3]; struct zjxx_info_struct zjxx_info; unsigned char checksum; }; struct sjxx_struct { unsigned int todo; }; struct bbxx_struct { unsigned int todo; }; struct fkxx_info_struct { unsigned char fk_flag; unsigned char extra_info[4]; }; struct fkxx_struct { unsigned char instruction[5]; unsigned int packet_len; unsigned char user_addr[3]; struct fkxx_info_struct fkxx_info; unsigned char checksum; }; /* struct user_to_peri_struct { struct dwxx_struct dwxx; struct txxx_struct txxx; struct icxx_struct icxx; struct zjxx_struct zjxx; struct sjxx_struct sjxx; struct bbxx_struct bbxx; struct fkxx_struct fkxx; }; */ extern void send_dwsq(); extern void send_txsq(unsigned char cmd, unsigned char *src_user_addr, unsigned char *dst_user_addr, unsigned char transfer_format, unsigned char *send_txsq_payload, unsigned int send_txsq_payload_len); extern void send_cksc(); extern void send_icjc(); extern void send_xtzj(); extern void send_sjsc(); extern void send_bbdq(); extern void init_uart3_for_bd(); extern void read_bd_rx_info(void); #endif
</pre><pre>