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

📄 uart.c

📁 linux下数据下载器的设计与实现
💻 C
字号:
/************************************************************************************ 
 Copyright (C), 1988-2007, Xi'an Keyway Control & Measurement Technology Co., Ltd
 FileName: UART.c 
 Description     :串口模块,主要实现串口初始化及数据传输       
 Version         :1.0 
 Function List   :    
 History:         // 历史修改记录 
      <author>      <time>        <version >       <desc> 
      LigangWang    07/08/07       1.0             build this moudle   
*************************************************************************************/

#include "globals.h"

/************************************************************************************* 
  Function:       UM_InitUART
  Description:    初始化串口,串口参数由CM_ConfigParameter全局变量决定
  Called By:      fw.c main()
  Input:          N/A
  Output:         N/A
  Return:         void
  Others:         该函数依赖全军变量 CM_ConfigParameter,故在调用该函数前需对其进行
  				  初始化。
*************************************************************************************/

void UM_InitUART()
{
	TMOD = (TMOD & 0x0F) | 0x20;     						// 设置定时器1工作方式2,自动重载方式  
	if(CM_ConfigParameter.RS232_bps <= RS232_57600 
		&& CM_ConfigParameter.RS232_bps != 0x00)
	{
		CKCON |= 0x10;           							//T1M = CLKOUT/4
	  	PCON |= 0x80 ;                						// 设置SMOD0=1,波特率加倍
	   	EICON |= 0x80;                						// 设置SMOD1=1,波特率加倍  
	}
	else if(CM_ConfigParameter.RS232_bps == RS232_115200)   //快速波特率模式
	{
		UART230 |= 3;
		PCON &= 0x7F ;                						// 设置SMOD0=0,
	   	EICON &= 0x7F;                						// 设置SMOD1=0,
	}

	SCON0 = 0x50;             								// 设置串行口0工作方式1,10位异步收发,REN=0,允许接收。RI=0,TI=0 
	SCON1 = 0x50; 			  								// 设置串行口1工作方式1,10位异步收发,REN=0,允许接收。RI1=0,TI1=0 
  	TH1  = CM_ConfigParameter.RS232_bps ;           		// 设置定时器1的初值       
  	TL1  = CM_ConfigParameter.RS232_bps;
	ES1 = 1;          										//允许串口1中断
  	TR1 = 1;												//允许串口1工作

	EA = 1; 												//打开中断
}

#ifdef DEBUG_VER

/************************************************************************************* 
  Function:       UM_SendChar
  Description:    以发送单字符值到串口1
  Called By:      ...
  Input:          ch @ char:欲发送的字符
  Output:         N/A
  Return:         void
  Others:         调用该函数前须调用UM_InitUART进行初始化串口
*************************************************************************************/
void UM_SendChar(char ch)
{
	SBUF1 = ch;												//写字符到发送缓冲区
	while(TI1 == 0);										//等待发送完
	TI1 = 0;
}

/************************************************************************************* 
  Function:       UM_SendString
  Description:    以发送字符串到串口1,字符串以0结束,长度不固定
  Called By:      ...
  Input:          str @ char *:欲发送的字符串
  Output:         N/A
  Return:         void
  Others:         调用该函数前须调用UM_InitUART进行初始化串口
*************************************************************************************/
void UM_SendString(const char * str)
{
	while(*str != 0)
	{
		UM_SendChar(*str);
		str++;
	}
}


/************************************************************************************* 
  Function:       UM_SendByte
  Description:    发送一个Byte类型值转换成16进制字符串到串口,例如0x5A,则分别发送
  				  5、A的ASIIC值到串口
  Called By:      ...
  Input:          ch @ BYTE :欲发送的数值
  Output:         N/A
  Return:         void
  Others:         调用该函数前须调用UM_InitUART进行初始化串口
*************************************************************************************/
void UM_SendByte(BYTE ch)
{
	if((ch >> 4) > 9)								//先发送高4位
		UM_SendChar((ch >> 4)+0x41-10);				//A~F,0x41为'A'的ASIIC码
	else
		UM_SendChar((ch >> 4)+0x30);				//0~9,0x30为'0'的ASIIC码

	if((ch & 0x0f) > 9)								//处理低4位
		UM_SendChar((ch & 0x0f)+0x41-10);
	else
		UM_SendChar((ch & 0x0f)+0x30);
	UM_SendChar(' ');
}

/************************************************************************************* 
  Function:       UM_SendDword
  Description:    发送一个双Word类型值转换成16进制字符串到串口
  Called By:      ...
  Input:          ch @ BYTE :欲发送的数值
  Output:         N/A
  Return:         void
  Others:         调用该函数前须调用UM_InitUART进行初始化串口
*************************************************************************************/
void UM_SendDword(DWORD ch)
{
	UM_SendByte(((BYTE*)&ch)[0]);					//高位优先
	UM_SendByte(((BYTE*)&ch)[1]);
	UM_SendByte(((BYTE*)&ch)[2]);
	UM_SendByte(((BYTE*)&ch)[3]);
	UM_SendChar(' ');
}

/************************************************************************************* 
  Function:       UM_SendWord
  Description:    发送一个Word类型值转换成16进制字符串到串口
  Called By:      ...
  Input:          ch @ BYTE :欲发送的数值
  Output:         N/A
  Return:         void
  Others:         调用该函数前须调用UM_InitUART进行初始化串口
*************************************************************************************/
void UM_SendWord(WORD ch)
{
	UM_SendByte(((BYTE*)&ch)[0]);					//高位优先
	UM_SendByte(((BYTE*)&ch)[1]);
	UM_SendChar(' ');
}

#endif	//endif DEBUG_VER

/************************************************************************************* 
  Function:       Serial_Interrupt1
  Description:    串口1接收中断服务程序,用于接收单个字符并保存到缓冲区
  Called By:      ...
  Input:          N/A
  Output:         N/A
  Return:         void
  Others:         调用该函数前须调用UM_InitUART进行初始化串口
  				  1.FM_CurrentBuff用于指示当前缓冲区 0为FM_DataBuff1,1为FM_DataBuff2
				  2.FM_DPointer1、FM_DPointer2分别用于缓冲区索引
				  3.每接收一个字符索引加以,当当前缓冲区满后切换到另外一个缓冲区+
				  4.每接收一个字符时清除timer0定时值
*************************************************************************************/
void Serial_Interrupt1() interrupt COM1_VECT
{
 	if(RI1 == 1)									
 	{
 		RI1 = 0;
		if(FM_CurrentBuff == 0)						//当前缓冲区为1	 
		{
			FM_DataBuff1[FM_DPointer1] = SBUF1;		//保存数据
			FM_DPointer1 ++;						//索引加1
			if(FM_DPointer1 >= MAX_RS232_BUFF)		//缓冲区满后切换缓冲区
				FM_CurrentBuff = 1;
		}
		else										//当前缓冲区为2
		{
			FM_DataBuff2[FM_DPointer2] = SBUF1;
			FM_DPointer2 ++;
			if(FM_DPointer2 >= MAX_RS232_BUFF)
				FM_CurrentBuff = 0;
		}
	}

	timer0_tick = 0;								//定时器清零
} 

⌨️ 快捷键说明

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