/******************************************************************************************************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_SUPPORTunsigned 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; //115200UCA3BR1 = 0x00;UCA3MCTL = 0x06; //波特率微调UCA3CTL1 &= ~UCSWRST; //初始化USCI状态机UCA3IE |=  UCRXIE; //使能BD串口RX中断#else  //波特率9600配置P10SEL |= BIT4+BIT5;UCA3CTL1 |= UCSWRST;//USCI状态机复位UCA3CTL1 |= UCSSEL_1;//ACLKUCA3BR0 = 0x03;//9600UCA3BR1 = 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 63txxx: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);
#elseDebugPrintBd("\r\n    输入发送内容长度:");scanf("%d", &payload_len);//payload_len = 78;for (i = 0; i < payload_len; ++i){payload[i] = 0x5a;}
#endifUCA2IE |=  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 1create_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();PUSHALLiv_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 0x46enum {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>

北斗短报文通信实现源码相关推荐

  1. 北斗短报文通信:北斗卡介绍

    在接触北斗短报文通信的时候,相信很多人都会对北斗卡感到陌生.通过本文,带你彻底搞清楚什么是北斗卡. 北斗卡作用:有北斗卡才能进入北斗通信网. 北斗卡大小:北斗卡和手机卡的封装和引脚顺序是兼容的,北斗卡 ...

  2. 北斗短报文一体机-Qt版(适用于Ubuntu和Windows)

    北斗短报文一体机-Qt版-适用于Ubuntu和Windows 本人有些原著作品是之前所写,由于当时没有做好记录,所以有些数据和图片都是最近补上的,同时有些结果都是当时所测的,现在有些都可能记不太清了, ...

  3. 北斗短报文优点以及行业应用

      北斗短报文设备是基于中国北斗二代.三代卫星导航系统的特点开发而来的,其同时具备定位与通讯功能,无需其他通讯系统支持,即可实现北斗用户间的双向短报文通信,而世界上其他卫星导航系统则不具备此功能. 什 ...

  4. 盘点丨除了卫星通信,北斗短报文还有这些常见的行业应用

    随着北斗三号短报文通信服务成果的发布以及华为"向上捅破天"的通信技术真身披露,让北斗短报文这项北斗系统特有的功能服务"火"了出圈.实际上,北斗短报文除了在大众领 ...

  5. 华为新品Mate50将搭载北三短报文通信功能?这项技术是何方神圣

    据消息称,苹果即将上新的iphone14系列将搭载卫星通讯功能,支持拨打电话和收发短信,方便用户在紧急情况下与外界取得联系,相信这是苹果十分引以为傲的成就.但是,有最新消息显示华为即将上新的Mate5 ...

  6. 北斗短报文服务在通信中的应用

    北斗作为我国具有自主知识产权的卫星导航系统,已经实现了全球性的导航服务,而作为其独特性存在的短报文服务,在通信应用中更是惊艳众人,有望在未来进一步推广.本文将展开如下论述:简要介绍北斗卫星导航系统和目 ...

  7. 北斗RDSS卫星短报文通信对构建全国覆盖的应急通信链路的重要作用

    我国幅员辽阔物产丰富,各大地区生产线都有工人日夜躬耕投入生产,然而地震.洪水.泥石流等大型自然灾害时有发生,经常造成巨大的人员伤亡和经济损失.灾害多发区的通信设备瘫痪事件时有发生,链路中断信号不畅更是 ...

  8. 分包组包 北斗通信_一种利用北斗短报文实现第三方数据双向传输的方法与流程...

    本发明涉及通信技术领域,特别涉及一种利用北斗短报文实现第三方数据双向传输的方法. 背景技术: 中国北斗卫星导航系统是中国自行研制的全球卫星导航系统,北斗RDSS是北斗系统区别于其他导航系统的特点之一, ...

  9. 【miscellaneous】北斗短报文

    北斗系统最大的特色在于有源定位和短报文特色服务,不止解决了中国有无卫星导航系统的问题,还能将短信和导航结合,是中国北斗卫星导航系统的独特发明,也是一大优势. 北斗的短报文功能,在国防.民生和应急救援等 ...

最新文章

  1. 【OpenCV 4开发详解】图像膨胀
  2. 博士申请 | 香港中文大学王思博助理教授招收图表示学习方向全奖博士生
  3. java中属性加参数_java – 具有类型参数的注释属性
  4. 4. XHTML语法
  5. Solr的安装步骤及增删改查代码示例
  6. 【Qt】Qt中QJsonValue类
  7. 2-1 nodejs和npm的安装和环境搭建
  8. 我的世界java刷怪数量_Minecraft我的世界Java版18w16a更新发布
  9. Comparable接口的使用:(知识回顾)
  10. 请不要重复犯我在学习Python和Linux系统上的错误
  11. MySQL的高可用实现:MySQL系列之十四
  12. OneNote2016 解决 OneNoteGem 插件 选项卡消失的问题
  13. 给机器人罗宾写一封英语回信_英语作文回信范文英语回信范文
  14. linux pulseaudio卸载,解决Ubuntu 9.04 下 PulseAudio声音故障
  15. 4-20MA/0-5V/0-3V隔离模块有哪些重要的功能?
  16. Rasa原文--训练NLU数据
  17. wifi 性能 测试 android,WiFi性能测试app下载
  18. 招聘:高级运维工程师
  19. JavaScript 排他思想
  20. 运算放大器电路PCB的设计技巧

热门文章

  1. 苏州银行李伟:银行数字化转型中的隐私计算
  2. R语言实战(中文完整版)pdf
  3. 猫狗图像识别(卷积神经网络算法,TensorFlow安装)
  4. 关于牛顿-欧拉法的外推和内推的理解
  5. xpath爬取airbnb民宿价格信息,为啥用属性定位不到元素,但是用文本内容模糊匹配却可以
  6. 团队管理的四大挑战——留人篇
  7. 简单 sql 语句 实用大全
  8. MLY翻译 -- 1.Why Machine Learning Strategy?
  9. bootstrap实现导航栏的响应式布局,当在小屏幕、手机屏幕浏览时自动折叠隐藏
  10. 华为mate40e灭屏显示教程