本帖最后由 reayfei 于 2011-12-11 21:10 编辑
LM3S811使用心得—从零开始学Cortex-M3内核单片机(四)续
实验5 UART0控制台
uartGets( )函数,该函数相当实用,能够从UART读入一个限制长度为size(包括末尾'\0')的字符串,按回车<Enter>结束。在读入的同时进行回显,如果输入有误,按退格键<Backspace>还可以进行修改。
源程序是一个UART0控制台例程,展示了uartGets( )函数的妙用。程序运行后,输入命令on会点亮LED5(蓝色),输入命令off会熄灭LED5(蓝色)。
不过也遇到一个问题:出现“cmd>>”后,第一次输入one(on代表“on”的意思,e代表“回车键”的意思,因为串口调试助手无法输入回车键,所以使用“e”代替)出现“Error command”,再次出现“cmd>> ”后第二次再输入one时,则显示“OK”,注意出现的是“cmd>> (空格)”。问题是不知道程序里什么原因第二次输出cmd>>时后面多了一个空格符?请高手指点!
源程序:
#include<LM3Sxxx.H>
#include"uartGetPut.h"
#include<string.h>
//定义LED
#defineLED_PERIPH SYSCTL_PERIPH_GPIOB
#defineLED_PORT GPIO_PORTB_BASE
#defineLED_PIN GPIO_PIN_0
#defineLED_PERIPBH SYSCTL_PERIPH_GPIOB //LED外围 B端口作为通用输入
#defineLED_PERIPDH SYSCTL_PERIPH_GPIOD //LED外围 D端口作为通用输入
#defineLED_PERIPEH SYSCTL_PERIPH_GPIOE //LED外围 E端口作为通用输入
voidcloseLED (void);
//防止JTAG失效
voidjtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能KEY所在的GPIO端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4); // 设置KEY所在管脚为输入
if(GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4) == 0x00)// 若复位时按下KEY,则进入
{
while(1); // 死循环,以等待JTAG连接
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口
}
//系统时钟初始化
voidclockInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_50V); // 设置LDO输出电压
SysCtlClockSet(SYSCTL_USE_OSC | // 系统时钟设置
SYSCTL_OSC_MAIN| // 采用主振荡器
SYSCTL_XTAL_6MHZ| // 外接6MHz晶振
SYSCTL_SYSDIV_1); // 不分频
/*
SysCtlLDOSet(SYSCTL_LDO_2_75V); // 配置PLL前须将LDO设为2.75V
SysCtlClockSet(SYSCTL_USE_PLL| // 系统时钟设置,采用PLL
SYSCTL_OSC_MAIN| // 主振荡器
SYSCTL_XTAL_6MHZ| // 外接6MHz晶振
SYSCTL_SYSDIV_10); // 分频结果为20MHz
*/
}
//主函数(程序入口)
intmain(void)
{
char s[40];
int size;
jtagWait(); // 防止JTAG失效,重要!
clockInit(); // 时钟初始化:晶振,6MHz
closeLED(); // 关闭LED函数
uartInit(); // UART0初始化
SysCtlPeripheralEnable(LED_PERIPH); // 使能LED所在的GPIO端口
GPIOPinTypeGPIOOutput(LED_PORT,LED_PIN);// 设置LED所在管脚为输出
uartPuts("Please input a command with<Enter>:\r\n"); // 请输入一个命令,按回车执行
uartPuts("\t on= LED turns on\r\n"); // 输入on,点亮LED
uartPuts("\t off = LED turnsoff\r\n"); // 输入off,熄灭LED
for (;;)
{
uartPuts("cmd>>");
size = uartGets(s, sizeof(s));// 从UART0接收命令字符串
if (size > 0)
{
if(!strcmp(s,"on")) // 如果输入on
{
GPIOPinWrite(LED_PORT, LED_PIN, 0xFF);// 点亮LED
uartPuts("OK\r\n");
}
else if(!strcmp(s,"off")) // 如果输入off
{
GPIOPinWrite(LED_PORT, LED_PIN, 0x00);// 熄灭LED
uartPuts("OK\r\n");
}
else
uartPuts("Error command\r\n"); // 错误命令
}
}
}
/*********************************************************************************************************
**Function name:closeLED()
**Descriptions:关闭LED函数
**input parameters:NONE
**output parameters:NONE
**Returned value:NONE
*********************************************************************************************************/
voidcloseLED (void)
{
//使能LED所在引脚
SysCtlPeripheralEnable(LED_PERIPBH);
SysCtlPeripheralEnable(LED_PERIPDH);
SysCtlPeripheralEnable(LED_PERIPEH);
//GPIO输出型的
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_1);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_0);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_1);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,GPIO_PIN_0);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,GPIO_PIN_1);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0);
//初始化过程拉低全部LED控制脚
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,~GPIO_PIN_0);//BLUE1管脚为低
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,~GPIO_PIN_1);//GREEN1管脚为低
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0,~GPIO_PIN_0);//RED1管脚为低
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,~GPIO_PIN_1);//BLUE2管脚为低
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0,~GPIO_PIN_0);//GREEN2管脚为低
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_1,~GPIO_PIN_1);//RED2管脚为低
} |