⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flexdec.c

📁 该源代码运行于89c51系列单片机上,可从输入FLEX二进制码流中解交织,处理CRC纠错,并最终解码出有效ASCII码数据.
💻 C
📖 第 1 页 / 共 2 页
字号:

	phase_code_count = 0;
	
	init_cfg( void );

	decode_buff_head =	0;
	decode_buff_tail =	0;

	while( 1 )
	{
		if( decode_buff_head != decode_buff_tail )
		{
			index	= 	0;
			if( decode_buff[ decode_buff_head ].ucProcotol == 1 )	//	flex
			{	
				addr_base = decode_buff[ decode_buff_head ].ucBlockData[ 0 ] & 0x0c;
				if( addr_base == 0x00 )
					addr_base = 1;
				else if( addr_base == 0x08 )
					addr_base = 2;
				else if( addr_base == 0x04 )
					addr_base = 3;
				else 
					addr_base = 4;		//codeword
				
				vector_base = ShiftLeftRight( ( decode_buff[ decode_buff_head ].ucBlockData[ 1 ] & 0x3f ), 6 );	//codeword
				message_base = 87;		//codeword 0 --- 87
				offset	= 0;
			
				while( ( addr_base + offset ) < vector_base )		//同一块数据 不同地址码
				{
					addr_capcode0 = GetCode( ( addr_base + offset ) );
					if( addr_capcode0 >= 0x008001 && addr_capcode0 <= 0x1e0000 )
						capcode_type = 1;			//	短地址码
					else if( addr_capcode0 >= 0x0001 && addr_capcode0 <= 0x8000 )
						capcode_type = 2;			//	长地址码
					else if( addr_capcode0 >= 0x1f6800 && addr_capcode0 <= 0x1f77ff )
						capcode_type = 3;			//	网络地址码
					else
					{
							capcode_type = 0;		// 	无效地址码
							continue;
					}
				
					if( capcode_type == 2 )			//	长地址码
					{
						addr_capcode1 = GetCode( ( addr_base + offset + 1 ) );
						if( addr_capcode1 < 0x1f7fff || addr_capcode1 > 0x1ffffe )
							continue;
					}
				
					if( ( vector_base + offset ) < message_base )
					{
						vector_code = GetCode( vector_base + offset );	//获得向量码字
						vector_type = GetInfo( vector_code, 4 , 6 );	//获得向量类型信息

							switch( vector_type )
							{
								case 0x05:		//字母数字向量(含汉字字符)
									message_addr = GetInfo( vector_code, 7, 13 );
									message_len = GetInfo( vector_code, 14, 20 );
									if( message_addr <= message_base )
										message_base = message_addr;	//message_base:消息区基地址
																		//message_addr:消息区当前地址
									//取消息的第一个码字									
									if( capcode_type == 2 ) 	//长地址码向量的第二个码字为消息的第一个码字
									{									//从向量区中取消息码字
										message_code = GetCode( vector_base + offset + 1 );	//第二个码字
										message_len --;
									}	
									else								//非长地址码从消息区中取消息码字
									{
										message_code = GetCode( message_addr ++ );
										message_len --;
									}
									if( message_code & 0x200000 )
										subsection_flag = 1;
									else
										subsection_flag = 0;
					
									message_byte = 0x00;
									bit_count = 7;
									current_bit = 21;
									
									while( message_byte != HEX3 && message_len != 0 )
									{
										for( ; bit_count != 0 && current_bit < 21; bit_count -- )
										{
											message_byte >>= 1;
											if( message_code & 0x80000000 )
											{
												message_byte |= 0x80;
											}
											bit_count --;
											message_code <<= 1;
											current_bit ++;
										}
										
										if( bit_count == 0 )
										{	//一个数字字符已收完
											bit_count = 7;
											message_byte = 0x00;
											//加入处理程序
										}
										
										if( current_bit == 21 )
										{
											message_code = GetCode( message_addr ++ );	//从消息区中取下一个新码字
											message_len	--;
											current_bit = 0;
										}
									}
									break;
								case 0x06:		//HEX和二进制向量
									break;
								case 0x00:		//保安消息向量
									break;
								case 0x01:		//短指令向量
									break;
								case 0x02:		//短消息向量
									break;
								case 0x03:		//数字向量
								case 0x04:		//特定格式数字向量
								case 0x07:		//编号的数字向量
									message_addr= GetInfo( vector_code,	7 , 13 );
									message_len = GetInfo( vector_code, 14,	16 ) + 1 ;	//当前消息码字长度
									if( message_len != 1 || capcode_type != 2 )
									{	//消息码字不等于1或不是长地址码则更新消息区基地址
										if( message_addr <= message_base )
											message_base = message_addr;	//message_base:消息区基地址
																			//message_addr:消息区当前地址
									}
									
									if( capcode_type == 2 ) 	//长地址码向量的第二个码字为消息的第一个码字
									{							//从向量区中取消息码字
										message_code = GetCode( vector_base + offset + 1 );	//第二个码字
										message_len --;
									}	
									else								//非长地址码
									{							//从消息区中取消息码字
										message_code = GetCode( message_addr ++ );
										message_len --;
									}
									//取第一个码字,确定第一个起始位
									if( vector_type == 0x07 )	//编号的数字向量的第一个码字(10bit)
									{
										current_bit = 10;
										message_code <<= 10;
									}
									else					//特定格式或标准数字向量的第一个码字(2bit)
									{
										current_bit = 2;
										message_code <<= 2;
									}
									message_byte = 0x00;
									bit_count = 4;
									while( message_byte != HEXC && message_len != 0 )
									{
										for( ; bit_count != 0 && current_bit < 21; bit_count -- )
										{
											message_byte >>= 1;
											if( message_code & 0x80000000 )
											{
												message_byte |= 0x80;
											}
											bit_count --;
											message_code <<= 1;
											current_bit ++;
										}
										
										if( bit_count == 0 )
										{	//一个数字字符已收完
											bit_count = 4;
											message_byte = 0x00;
											//加入处理程序
										}
										
										if( current_bit == 21 )		
										{
											message_code = GetCode( message_addr ++ );//从消息区中取下一个新码字
											message_len	--;
											current_bit = 0;
										}
									}
									break;
								default:		
									break;
							}						
					}	
					else	// vector_base + offset >= message_base :单音
						tone_pro( );	//单音呼叫处理后,检测是否还有单音呼叫
						
					if( capcode_type == 2 )
						offset += 2;	//偏移地址加2
					else
						offset ++;		//偏移地址加1
				}
				decode_buff[ decode_buff_head ].ucBlockUsedflag = 0;	//disable data block
				decode_buff_head ++;
				decode_buff_head %= MAXDECODEBUFF;	//头指针指向下一个数据块
				bit_count = 7;
				message_byte = 0x00;
			}
			else
			{	//提取pocsag数据块
				for( message_addr = 0; message_addr < decode_buff[ decode_buff_head ].uiBlockCodeWords; message_addr ++ )
				{
					message_code = GetCode( message_addr );
					if ( message_code == 0x7cd215d8 || message_code == 0x832dea27 )
						pocsag_addr = 0;
					else if ( message_code == 0x7a89c197 || message_code == 0x85763e68 );
					else
					{	// 不是空闲码,不是SC
						if( message_code & 0x80000000 )
						{	//该码字为消息码
							message_code <<= 1;	//移出最高位,20位消息码
							 								
							for( current_bit = 0; current_bit < 20; current_bit ++ )
							{
								message_byte >>= 1;
								if( message_code & 0x80000000 )
								{
									message_byte |= 0x80;
								}
								message_code <<= 1;									
								bit_count --;
								if( bit_count == 0 )
								{	//一个数字字符已收完
									bit_count = 7;
									if( message_byte == HEXC )
									{	
										message_byte = 0x00;
										break;
									}	
									message_byte = 0x00;
									//加入处理程序
								}
							}
						}
						else	//该码字为地址码
						{
							addr_capcode0 = GetInfo( message_code , 1 , 18 );
							//初始化消息参数
							message_byte = 0x00;
							bit_count = 7;
							//处理地址码
						}
					}
					pocsag_addr ++;
					pocsag_addr %= 17;
				}		
			}
		}
	}
}

void init_cpu( void )
{
	DATA_PORT = 0xFF;
	TMOD	= 0x21;
	SCON	= 0x50;
	TH1	= 0xFB;
	TL1	= 0xFB;
	TR1	= 1;
	IT0	= 1;
	IT1	= 1;
	EA	= 1;
	crc_flag = 0;
}

void init_cfg( void )
{
	ES	= 1;
	EX0	= 1;
	EX1	= 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -