📄 uart_module.c
字号:
/********************************************************/
/*UART_MODULE.c*/
/********************************************************/
/* 模块:UART_MODULE */
/* 描述:串口初始化模块 */
/* 注意:使用前需要先定义串口波特率,如: */
/* //定义串口波特率为115200 */
/* #define UART_BPS 115200 */
/* */
/* 处理器: */
/* 调用函数: */
/* 版本历史: */
/* V1.0 */
/* 作者: */
/* 日期: */
/* 修改原因: */
/********************************************************/
#include "config.h"
uint8 ary[512]=
{
0xFA,0xBE,0x00,0x7C,0xBF,0x00,0x7A,0xB9,0x00,0x01,0xFC,0x0E,0x1F,0x0E,0x07,0xF3,0xA5,0xEA,0x16,
0x7A,0x00,0x00,0xBB,0xBE,0x7B,0x33,0xC9,0x80,0x3F,0x80,0x75,0x06,0xFE,0xC5,0x8B,0xF3,0xEB,0x07,
0x80,0x3F,0x00,0x75,0x02,0xFE,0xC1,0x83,0xC3,0x10,0x81,0xFB,0xFE,0x7B,0x72,0xE5,0x83,0xF9,0x04,
0x74,0x0B,0x81,0xF9,0x03,0x01,0x74,0x0A,0xBB,0xA5,0x7A,0xEB,0x2C,0xBB,0x87,0x7A,0xEB,0x27,0x8B,
0x4C,0x02,0x8B,0x14,0xB8,0x01,0x02,0xBB,0x00,0x7C,0xCD,0x13,0x73,0x05,0xBB,0xBC,0x7A,0xEB,0x13,
0x2E,0xA1,0xFE,0x7D,0x3D,0x55,0xAA,0x74,0x05,0xBB,0xBC,0x7A,0xEB,0x05,0xEA,0x00,0x7C,0x00,0x00,
0x2E,0x8A,0x07,0x3C,0x00,0x74,0x0C,0x53,0xBB,0x07,0x00,0xB4,0x0E,0xCD,0x10,0x5B,0x43,0xEB,0xED,
0xEB,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x06,0x00,0x06,0x1F,0xFF,0xC6,0x83,0x00,
0x00,0x00,0x9D,0xBE,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAA
};
/*F_UART0_Init****************************************/
/* 函数名:UART0_Init() */
/* 参数: 无 */
/* 返回值:无 */
/* 作用域: */
/* 功能: 初始化串口0 */
/********************************************************/
void UART0_Init(void)
{
U0LCR=(ULCR_num|0x80);//设置串口模式并使能访问除数锁存
U0DLM=UDLM_num;//设置除数锁存器,该值在config.h中预定义
U0DLL=UDLL_num;
U0FDR=UFDR_num;
U0LCR=ULCR_num;//设置串口模式并禁止访问除数锁存
U0FCR=0x01;//使能FIFO,触发点为1个字符
U0IER=0x01;//允许RBR中断
}
/* End of F_UART0__Init********************************/
/*F_UART0_GetByte****************************************/
/* 函数名:UART0_GetByte() */
/* 参数: 无 */
/* 返回值:接收到的数据 */
/* 作用域: */
/* 功能: 从串口接收1字节数据 */
/********************************************************/
uint8 UART0_GetByte (void)
{
uint8 rcv_dat=0;
while((U0LSR & 0x01) == 0);//等待有效数据
rcv_dat = U0RBR;
return (rcv_dat);
}
/* End of F_UART0_GetByte********************************/
/*F_UART0_GetStr*****************************************/
/* 函数名: */
/* 参数: s 指向接收数据数组的指针 */
/* n 接收的个数 */
/* 返回值: 无 */
/* 作用域: */
/* 功能: 从串口接收 */
/********************************************************/
void UART0_GetStr (uint8 *s, uint32 n)
{
for ( ; n>0; n--)
{
*(s++) = UART0_GetByte();
}
*(s++) = '\0';
}
/* End of F_UART0_GetStr*********************************************/
/*F_UART0_SendByte*****************************************************/
/* 函数名:UART0_SendByte() */
/* 参数: dat 要发送的数据 */
/* 返回值:无 */
/* 作用域: */
/* 功能: 向串口发送字节数据,并等待发送完毕,查询方式 */
/********************************************************/
void UART0_SendByte (uint8 dat)
{
U0THR = dat;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}
/* End of F_UART0_SendByte*********************************************/
/*F_UART0_SendStr*****************************************************/
/* 函数名:UART0_SendStr() */
/* 参数: str 要发送的字符串的指针 */
/* 返回值:无 */
/* 作用域: */
/* 功能: 向串口发送一字符串 */
/********************************************************/
void UART0_SendStr (uint8 const *str)
{
while (1)
{
if (*str == '\0') break; // 遇到结束符,退出
UART0_SendByte(*str++); // 发送数据
}
}
/* End of F_UART0_SendStr*********************************************/
/*
以字节方式接收一个字符串,并保存到静态数组中(收到一个字节,判断命令接收数组是否已满,
未满即判断是否为0x0D或0x0A,是回车符则不回显并将0x0D改为0x00,既不是回车也不是换行则存储后立刻回显)。
然后判断数组中的字符串是否是预定义的命令,是则执行,不是则回显:
输入命令错误,请重新输入。
*/
__irq void UART0_SERV(void)
{
char *ptr;
static uint8 rcv_ary[512];
uint16 ctr;
uint8 rcv_byte;
static char cmd_str[10]={0x00};//声明一个静态命令接收数组,可以存放8位字节的命令。cmd_str[0]中存放空字节
static uint8 str_ptr=1;//命令接受数组cmd_str[]的数组指针,静态变量。
while(U0LSR&1==0x01)
{
rcv_byte=UART0_GetByte();//字节接收存储器
if(str_ptr<10) //判断命令接收数组是否已满
{
if(rcv_byte!=0x0D)//判断数据是否为回车符
{
cmd_str[str_ptr]=rcv_byte;
UART0_SendByte(rcv_byte);
str_ptr++;
}
else if(rcv_byte==0x0D)//若接收到的字节为回车符,存储不回显
{
cmd_str[str_ptr]=0x00;
ptr=&cmd_str[1];
if(strcmp(ptr,"$SDINIT")==0)
{
UART0_SendStr("\r\n");
UART0_SendStr(">");
UART0_SendStr("你发送给我的命令是:$SDINIT.\r\n");
rcv_byte=SD_Initialize();
UART0_SendByte(rcv_byte);
UART0_SendStr("\r\n");
UART0_SendStr("请发送给我新的命令\r\n");
UART0_SendStr(">");
str_ptr=1;
}
else if(strcmp(ptr,"$REPARE")==0)
{
UART0_SendStr("\r\n");
UART0_SendStr(">");
UART0_SendStr("你发送给我的命令是:$REPARE.\r\n");
if(SD_ReadBlock(0,rcv_ary))
UART0_SendStr("块读失败");
else
{
UART0_SendStr("块读成功!\r\n");
for(ctr=0;ctr<512;ctr++)
{
UART0_SendByte(rcv_ary[ctr]);
}
}
if(SD_WriteBlock(0,ary))
UART0_SendStr("块写失败");
else
{
UART0_SendStr("块写成功!\r\n");
}
if(SD_ReadBlock(0,rcv_ary))
UART0_SendStr("块读失败");
else
{
UART0_SendStr("块读成功!\r\n");
for(ctr=0;ctr<512;ctr++)
{
UART0_SendByte(rcv_ary[ctr]);
}
}
UART0_SendStr("\r\n");
UART0_SendStr("请发送给我新的命令\r\n");
UART0_SendStr(">");
str_ptr=1;
}
else if(strcmp(ptr,"$RDBLK")==0)
{
UART0_SendStr("\r\n");
UART0_SendStr(">");
UART0_SendStr("你发送给我的命令是:$RDBLK.\r\n");
if(SD_ReadBlock(0,rcv_ary))
UART0_SendStr("块读失败");
else
{
UART0_SendStr("块读成功!\r\n");
for(ctr=0;ctr<512;ctr++)
{
UART0_SendByte(rcv_ary[ctr]);
}
}
}
else
{
UART0_SendStr("命令错误1,请重新输入!");
UART0_SendStr("\r\n");
UART0_SendStr(">");
str_ptr=1;
}
}
}
else//接收数组已满,但还未接收到回车换行符,说明命令错误
{
UART0_SendStr("命令错误3,请重新输入!");
UART0_SendStr("\r\n");
UART0_SendStr(">");
str_ptr=1;
}
}
VICVectAddr=0;
}
//将一个十六进制表示的数从串口终端显示出来
void UART0_hex2char(uint8 num_hex)
{
UART0_SendByte(num_hex/16+48);
UART0_SendByte(num_hex%16+48);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -