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

📄 com_driver.c

📁 lab windows uart driver
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************
*  COPYRIGHT DaTang Mobile Communications Equipment CO.,LTD		*
****************************************************************/
/****************************************************************
* FileName:	Com_driver.c
* version: 1.00
* Purpose: 
* Authors: XiaJing 2006-3-15 16:11:13
* Notes:   Can be used for A2000 project(Dual Mode:TD-SCDMA & GSM)
Be released as ComDvr_DM.dll
****************************************************************/
#include <visa.h>
#include "share.h"
#include <ansi_c.h>
#include <formatio.h>
#include <rs232.h>
#include <cvirte.h>		
#include <userint.h>
#include <utility.h>
#include "main.h"
//#include "commandmsg.h"
#include "basic_type.h"
#include "amthead.h"
#include "CRC32CheckModc.h"
#include "Comm.h"



//#define TESTCODE_DEBUG		1
ShareMem *sharedata=NULL;
int Rs232;
int msgpanel;

unsigned char cmdbuf[AMT_COMMAND_BUF_LENGTH];
EnumErrorCode ComRw(void);
EnumErrorCode Com_Rd(double Wt);
void Com_init(void);

/*********************************************************
//函数名:ShareM
//功能:initialize share memory
//参数: ShareMem *structure,int panel
//返回值:无
//注释:
//遗留的问题:无
*********************************************************/
void DLLEXPORT ShareM(ShareMem *structure)
{
	sharedata=structure;
}

/**********************************************************************
函数名:	ComInfo
功能: 	Interface,通过串口与UE通信,控制UE
//
参数: 	int ComType:Command type,具体定义见Comm.h
参数: 	int comno:串口编号选择,有1和2两个值供选择
参数: 	int *data:需要从外部输入和输出的整型变量指针
参数: 	int *Buf:需要从外部输入和输出的char型变量指针
参数: 	EnumErrorCode *errinfo:需要从外部输入的整型变量指针,用于存放产生的错误代码
//
返回值:	无
注释:
遗留的问题:无
//
**************************************************************************/
void DLLEXPORT ComInfo(int ComType, int comno,int *data,char *Buf,EnumErrorCode *errinfo)
{
	unsigned long int MsgLen;
	int temp,i;
	char str[100];
	BOOL bTemp;
	//	EnumCommand CommType;
	//	EnumAtom DataType;
	MAN_AMT_COMMAND CommType;
	//  MAN_AMT_ATOM	DataType;
#ifdef TESTCODE_DEBUG
	char Msg[300];
#endif
	
	if(comno==1) Rs232=sharedata->handle_com1; ////select com port
	else Rs232=sharedata->handle_com2;
	switch (ComType)  //command type
	{
		//Read Flash
		//输入:data[0]: AMT_DATAADDR_ATOM, Flash address
		//		data[1]: AMT_DATALENGTH_ATOM, Data length
		//输出:*Buf
		//		*errinfo
		//备注:目前无用
	case RDFLASH:  ////FLASH 读命令
		amt_set_commandtype(cmdbuf,AMT_READFLASH_CMD); ////set command type
		amt_set_int(cmdbuf,AMT_DATAADDR_ATOM,data[0]); ////set command para 1(flash address)
		amt_set_int(cmdbuf,AMT_DATALENGTH_ATOM,data[1]);  ////set command para 2(data length)
		//DataType=AMT_DATA_ATOM;  ////set data type
		for(i=0;i<3;i++)	 ////check if there is com error
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==enNoneErr) break;  //success
		}
		if(*errinfo!=0) break;  ////there is error
		CommType=amt_get_commandtype(cmdbuf); //get response command type
		if(CommType!=AMT_READFLASH_RSPCMD) 
		{
			*errinfo=ComRspTypeErr;  ////command type error
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code 
		if(*errinfo!=0)break;  ////there is error,break
		MsgLen=amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,0);
		amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,MsgLen);
		break;
		//Write Flash
		//输入:data[0]: AMT_DATAADDR_ATOM, Flash address
		//		data[1]: data length
		//		*Buf: data
		//输出:*errinfo
		//备注:目前无用
	case WRFLASH:  ////FLASH 写命令
		amt_set_commandtype(cmdbuf,AMT_WRITEFLASH_CMD);  ////set command type
		amt_set_int(cmdbuf,AMT_DATAADDR_ATOM,data[0]); //para 1
		//amt_set_int(cmdbuf,AMT_DATALENGTH_ATOM,data[1]);
		amt_set_bytes(cmdbuf,AMT_DATA_ATOM,Buf,data[1]);//para 2
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();   //send command and read response
			if(*errinfo==enNoneErr) break; //
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf);  //get response command type
		if(CommType!=AMT_WRITEFLASH_RSPCMD)  //
		{
			*errinfo=ComRspTypeErr; //command type wrong
			break;
		}
		temp=amt_get_int(cmdbuf,AMT_DATALENGTH_ATOM); //get data length
		if(temp!=data[1]) //write data length not equal written data length?
		{
			*errinfo=5;  //set error no.
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM); //read error code     
		break;
		//读取电池电压ADC值
		//*Buf: NULL
		//输出:*data(data[0])
		//		*errinfo
		//备注:
	case RDBATT:  ////电池电压ADC值读取
		amt_set_commandtype(cmdbuf,AMT_READ_BATTERY_CMD);     
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==enNoneErr) break;   //
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf);  //get response command type
		if(CommType!=AMT_READ_BATTERY_RSPCMD)
		{
			*errinfo=ComRspTypeErr;
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code   
		if(*errinfo!=0) break;
		*data=amt_get_int(cmdbuf,AMT_BATTERYVALUE_ATOM);  
		break;
		//TX turn on
		//输入:
		//*data: data[0]	TX Mode	1:	单码道单时隙TD-SCDMA信号
		//							2:	单码道双时隙TD-SCDMA信号
		//							3:	双码道单时隙TD-SCDMA信号
		//							4:	双码道双时隙TD-SCDMA信号
		//		 data[1]	扩频因子0:	SF8
		//							1:	SF16
		//		 data[2]	Time Slot
		//		 data[3]	Channel No.:Frequency(MHz)*5
		//		 data[4]	Uppts	0:	不输出Uppts
		//							1:	输出Uppts
		//		 data[5]	Power Level:Power(dBm)+120	
		//*Buf: NULL
		//输出:*errinfo
		//备注:
	case TXON:  ////开始发射命令
		amt_set_commandtype(cmdbuf,AMT_STARTTX_CMD);
		amt_set_int(cmdbuf,AMT_TXMODE_ATOM,data[0]); //
		amt_set_int(cmdbuf,AMT_SF_ATOM,data[1]);	 //
		amt_set_int(cmdbuf,AMT_TIMESLOT_ATOM,data[2]);  //
		amt_set_int(cmdbuf,AMT_POWER_ATOM,data[3]); //
		amt_set_int(cmdbuf,AMT_FREQ_ATOM,data[4]); //         
		amt_set_bool(cmdbuf,AMT_UPPTS_ATOM,data[5]); //
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==enNoneErr) break;  //
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf);  //get response command type 
		if(CommType!=AMT_STARTTX_RSPCMD)
		{
			*errinfo=ComRspTypeErr;
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code
		break;
		//TX turn off
		//*data: NULL
		//*Buf: NULL
		//输入:无
		//输出:*errinfo
		//备注:本功能必须在TXON执行成功后方可使用
	case TXSTOP:  ////停止发射命令
		amt_set_commandtype(cmdbuf,AMT_STOPTX_CMD);   
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==-100)	  //测试线程退出
			{
				//sharedata->TestStop=0;
				*errinfo=ComRw();   //
				//sharedata->TestStop=1;
			}
			if(*errinfo==enNoneErr) break;
		}
		if(*errinfo!=0) break;  
		CommType=amt_get_commandtype(cmdbuf);  //get response command type  
		if(CommType!=AMT_STOPTX_RSPCMD)
		{
			*errinfo=ComRspTypeErr;
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code
		break;
		//改变发射功率
		//*Buf: NULL
		//输入:*data(data[0])	Power Level:Power(dBm)+120
		//输出:*errinfo
		//备注:本功能必须在TXON执行成功后方可使用
	case TXPWR:  ////改变发射功率命令
		amt_set_commandtype(cmdbuf,AMT_CHANGETXPOWER_CMD);
		amt_set_int(cmdbuf,AMT_POWER_ATOM, data[0]);  //para 1:transmit power
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==enNoneErr) break; //
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf);  //get response command type     
		if(CommType!=AMT_CHANGETXPOWER_RSPCMD)
		{
			*errinfo=ComRspTypeErr;
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code        
		break;
		//改变发射频率
		//*Buf: NULL
		//输入:*data(data[0])	Channel No.:Frequency(MHz)*5
		//输出:*errinfo
		//备注:本功能必须在TXON执行成功后方可使用
	case TXFREQ:  ////改变发射频点命令
		amt_set_commandtype(cmdbuf,AMT_CHANGETXFREQ_CMD); 
		amt_set_int(cmdbuf,AMT_FREQ_ATOM, data[0]);   //para 1:transmit frequency
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==enNoneErr) break;  //
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf); //get response command type
		if(CommType!=AMT_CHANGETXFREQ_RSPCMD)
		{
			*errinfo=ComRspTypeErr;
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code
		break;
		//进入接收状态
		//*Buf: NULL
		//输入:*data(data[0])	Channel No.:Frequency(MHz)*5
		//输出:*errinfo
		//备注:
	case RXON:  ////进入接收状态
		amt_set_commandtype(cmdbuf,AMT_STARTRX_CMD); 
		amt_set_int(cmdbuf,AMT_FREQ_ATOM, data[0]);  //DL channel no.
		for(i=0;i<1;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo>-1) break; //
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf);  //get response command type  
		if(CommType!=AMT_STARTRX_RSPCMD)
		{
			*errinfo=ComRspTypeErr;
#ifdef TESTCODE_DEBUG
			memset(Msg,0,sizeof(Msg));
			temp=(int)CommType;
			sprintf(Msg,"Command Type is error!\n error Command type is %d\n",temp);
			SetCtrlVal(msgpanel, TEXTPANEL_TEXTBOX, Msg);
#endif 
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code
		break;
		//退出接收状态
		//*data: NULL
		//*Buf: NULL
		//输入:无
		//输出:*errinfo
		//备注:本功能必须在RXON执行成功后方可使用
	case RXSTOP:  ////退出接收状态
		amt_set_commandtype(cmdbuf,AMT_STOPRX_CMD);   
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==-100)  ////测试线程退出
			{
				//sharedata->TestStop=0; 
				*errinfo=ComRw();  
				//sharedata->TestStop=1; 
			}
			if(*errinfo==enNoneErr) break;
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf);  //get response command type 
		if(CommType!=AMT_STOPRX_RSPCMD)
		{
			*errinfo=ComRspTypeErr;			  //
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code
		break;
		//读取接收到的业务数据
		//输入:*data:	data[0]	Time Slot(默认为4)
		//				data[1]	Frame number,需要读取的帧数
		//				data[2]	Power Level:Power(dBm)+110
		//输出:*data:	data[i*2+3]返回的每帧数据的帧号,i=0,1,...,data[1]-1
		//				data[i*2+4]返回的每帧数据的长度,i=0,1,...,data[1]-1
		//		*Buf: 读取到的业务数据,byte型
		//		*errinfo
		//备注:本功能必须在RXON执行成功后方可使用
	case RXDATA:  ////传送译码过后的数据
		//Com_init();
		FlushInQ (Rs232);  //Removes all characters from the input queue of the COM port
		FlushOutQ (Rs232);
		amt_set_commandtype(cmdbuf,AMT_RXDATA_CMD); 
		amt_set_int(cmdbuf,AMT_TIMESLOT_ATOM,data[0]);  //时隙点
		amt_set_int(cmdbuf,AMT_FRAMECOUNT_ATOM,data[1]);  //帧数
		amt_set_int(cmdbuf,AMT_POWER_ATOM,data[2]);  //功率
		for(i=0;i<3;i++)
		{
			*errinfo=ComRw();  //send command and read response
			if(*errinfo==enNoneErr) break; //
		}
		if(*errinfo!=0) break;
		CommType=amt_get_commandtype(cmdbuf);  //get response command type
		if(CommType!=AMT_RXDATA_RSPCMD)
		{
			*errinfo=ComRspTypeErr;
			break;
		}
		*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);  //read error code   
		if(*errinfo!=0) break;
		data[3]=amt_get_int(cmdbuf,AMT_FRAMEINDEX_ATOM);  //帧号(索引号)
		data[4]=amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,0);  //第一帧长度
		amt_get_bytes(cmdbuf,AMT_DATA_ATOM,Buf,data[4]);  //第一帧译码后的数据 
		if(data[1]>1)			 //接收不止1帧,
		{
			temp=data[1];		//帧数
			MsgLen=data[4];		//长度
			for(i=1;i<data[1];i++)
			{
				*errinfo=Com_Rd(5);   //0.5更改
				if(*errinfo==0)
				{
					CommType=amt_get_commandtype(cmdbuf);  //get response command type  
					*errinfo=amt_get_int(cmdbuf,AMT_ERRORCODE_ATOM);   
					if(*errinfo==0)
					{
						data[i*2+3]=amt_get_int(cmdbuf,AMT_FRAMEINDEX_ATOM);  	    //data[5] 桢号(索引号)
						data[i*2+4]=amt_get_bytes(cmdbuf,AMT_DATA_ATOM,0,0);		//data[6] 数据长度
						amt_get_bytes(cmdbuf,AMT_DATA_ATOM,&Buf[MsgLen],data[i*2+4]);//数据
						MsgLen=MsgLen+data[i*2+4];
					}
				}
				if(*errinfo!=0) temp=temp-1;
			}
			data[1]=temp;   //data[1]:实际接收到的帧数
		}
		break;
		//传送IQ的数据
		//输入:*data: data[1]	Power Level:Power(dBm)+110

⌨️ 快捷键说明

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