📄 uart.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 + -