一种串口控制台(命令行)的实现

来源:互联网 发布:印欧语系 知乎 编辑:程序博客网 时间:2024/06/04 23:22

本串口控制台代码移植自鼎尚的LPC1788开发板程序,目标板是普中科技PZ6806L 单片机为stm32F103ZE。

源代码地址:http://download.csdn.net/download/wwddgod/9991282

移植过程如下:

步骤一:实现几个串口接收及发送的函数


#define SHELL_RCV_BUFFER_LEN  128
uint8_t g_shellRcvBuffer[SHELL_RCV_BUFFER_LEN];
uint32_t g_shellRcvBufferLen = 0;

uint8_t g_flagUart = 0;

unsigned long UART_snd(unsigned char * data, unsigned long len)
{
    int32_t i, next;

    if (len == 0)
    {
        len = 100;
    }

    USART_Cmd(USART1,DISABLE);            

    for (i = 0; i < len; i++)
    {
        next = g_uartTxBufferTail + 1;
        if (next >= UART_Tx_BUFFER_LEN)
        {
            next = 0;
        }
        
        if (next == g_uartTxBufferHead)
        {
            break;
        }
        g_uartTxBuffer[g_uartTxBufferTail] = data[i];
        
        g_uartTxBufferTail = next;
    }

    if (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==SET)
    {
      
        USART_SendData(USART1, g_uartTxBuffer[g_uartTxBufferHead]);

        g_uartTxBufferHead++;
        if (g_uartTxBufferHead >= UART_Tx_BUFFER_LEN)
        {
            g_uartTxBufferHead = 0;
        }
    }

    USART_Cmd(USART1,ENABLE);            

    return i;
}

__inline void uartRead(void)
{

    uint8_t buffer;
    buffer = USART_ReceiveData(USART1);
    g_shellRcvBuffer[g_shellRcvBufferLen++] = buffer;

}
__inline void uartWrite(void)
{
    uint16_t i;
    
    if(g_uartTxBufferHead != g_uartTxBufferTail)
    {
        USART_SendData(USART1,g_uartTxBuffer[g_uartTxBufferHead]);
        g_uartTxBufferHead++;
        if (g_uartTxBufferHead >= UART_Tx_BUFFER_LEN)
        {
                g_uartTxBufferHead = 0;
        }
    }
}
extern unsigned int g_ms,gj_ms;
void USART1_IRQHandler(void)  
{
    static u8 k;
    static unsigned int j_ms = 0;
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)
    {
        uartRead();
        gj_ms = g_ms;
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    }else if(USART_GetITStatus(USART1,USART_IT_TC)!=Bit_RESET)
    {
        USART_ClearITPendingBit(USART1,USART_IT_TC);
        uartWrite();
        
    }
}

步骤二:添加shellTask.c 及shell.h

注意串口初始化时需要开启接收不为空中断 及 发送完成中断

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART1,USART_IT_TC,ENABLE);

步骤三:在一个循环内实现函数 shellRcv(g_shellRcvBuffer, g_shellRcvBufferLen);如

while(1)
    {
        delay_ms(1);
        g_ms +=1;
        if(g_ms-gj_ms>3 && gj_ms !=0)
        {
            g_flagUart = 1;
            gj_ms = 0;
        }
        if(g_flagUart == 1)
        {
            USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
                 
            if (g_shellRcvBufferLen)
            {
                shellRcv(g_shellRcvBuffer, g_shellRcvBufferLen);
                
                 g_shellRcvBufferLen = 0;            
            }
    
            USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
            g_flagUart = 0;
        }
    }

步骤四:使用shellRegCmd("dir", cmdDir, "dir list"); 注册命令: “dir”  为命令  cmdDir 对应的函数名 “dir list”为help显示的命令帮助信息

步骤五:shellSnd("->", 2); 可显示输出信息

阅读全文
1 0
原创粉丝点击