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

📄 uart.c

📁 NiosII串口命令解析串口部分
💻 C
字号:
#define UART_GLOBAL
#include "includes.h"

char rx_buf[MAX_RECV_SIZE];
char tx_buf[MAX_SEND_SIZE];
int status,control;
//unsigned char sendcount=0;
int sendcount=0;
unsigned char rx_index=0;
//unsigned char tx_index=0;
int tx_index=0;
char command_flag=0;
char com_init_flag=0;
char promptcount=0;
char sendprocessing=0;        //发送允许标志
char echo=ECHOON;


void handle_uart_interrupt();
void recvProcess(unsigned char recvchar);
void sendProcess();
void sendPrompt();
void setBaudrate(int);
void uart_init()   //串口初始化,等待接受命令   the clock of UART is 85M,not 50M 
{
    setBaudrate(115200);
    alt_irq_register(UART1_IRQ,NULL,handle_uart_interrupt);
    control_write(UART1_BASE,0x0040);
    //baudrate_set(UART1_BASE,0x1b2);
    //baudrate_set(UART1_BASE,0x2e1);//the clock of UART is 85M,not 50M
    //baudrate_set(UART1_BASE,0x2296);
}

void handle_uart_interrupt(void *context,unsigned long id) //串口ISR
{   
    unsigned char receivechar;
    status=status_read(UART1_BASE);
    control=control_read(UART1_BASE);
    if(status&control&RRDY_MASK)        //接收准备好(可读)中断
    {
      if(sendprocessing==0)
      {
          receivechar=uart_receive(UART1_BASE);
          //status_write(UART1_BASE,status&(~RRDY_MASK));
          recvProcess(receivechar);
      }

      if(command_flag==1)
      {       
        regularResponse(rx_buf);  
        sendprocessing=1;
        command_flag=0; 
        //control_write(UART1_BASE,control&TRDY_MASK|~RRDY_MASK);
        control_write(UART1_BASE,0x0040);
      }
    }   
    if(status&control&TRDY_MASK)    //发送寄存器为空中断
      { 
        if(com_init_flag==0) 
        { 
            sendPrompt();
        }
        if(sendprocessing!=0)
        {
            sendProcess();
        }
      }      
}


void writeChar(unsigned char thechar)//写字符到tx_buf[];
{
    tx_buf[sendcount++]=thechar;
}
void writeString(unsigned char *pstr)//写字符串到tx_buf[];
{
    while(*pstr)
       tx_buf[sendcount++]=*pstr++;
}
void uartSendChar(unsigned char thechar)//发送一个字符
{
    status_write(UART1_BASE,status&(~TRDY_MASK));
    uart_send(UART1_BASE,thechar);
}

void deleteChar()                  //Backspace键
{
    writeChar(0x8);
    writeChar(' ');
    writeChar(0x8);
    writeChar('\0');
    sendcount=0;
    sendprocessing=1;
    control_write(UART1_BASE,0x0040);
}

void sendPrompt()        //中断实现sendPrompt,不需要加延时
{
    
    promptcount++;
    status_write(UART1_BASE,status&(~TRDY_MASK));
    if(promptcount==1)
        uart_send(UART1_BASE,'\r');
    else if(promptcount==2)
        uart_send(UART1_BASE,'\n');
    else
    {
        uart_send(UART1_BASE,'>');
        com_init_flag=1;
        control_write(UART1_BASE,0x0080);  
        promptcount=0;
        sendprocessing=0;
        //control_write(UART1_BASE,control&(~TRDY_MASK)|RRDY_MASK);  
    }
    
}

void setBaudrate(int baudrate) //the clock of UART is 85M,not 50M 
{
    int divisor;
    long clock=85000000;
    divisor=(int)clock/(baudrate+0.5);
    baudrate_set(UART1_BASE,divisor);
}

void sendProcess()//发送处理
{   
    if(tx_buf[tx_index]!='\0')
        uartSendChar(tx_buf[tx_index++]);
    else
    {   
        //control=control_read(UART1_BASE);
        status_write(UART1_BASE,status&(~TRDY_MASK));
        //control_write(UART1_BASE,control&(~TRDY_MASK)|RRDY_MASK);
        control_write(UART1_BASE,0x0080);
        sendprocessing=0;
        tx_index=0;
    }
}

void recvProcess(unsigned char recvchar)//
{
    switch(recvchar)
    {
        case 0x8:
        {
            if(rx_index>0)
            {
                rx_index--;
                if(echo)
                {
                    //uartSendChar(0x8);
                    //uartSendChar(' ');
                    //usleep(1000);        //delay x ms
                    //uartSendChar(0x8);
                    deleteChar();
                }
            }
            break;
        }
        case '\r':
        {
            if(rx_index>0)
            {
                if(rx_buf[rx_index-1]!=' ')
                   rx_buf[rx_index]='\0';
                else
                   rx_buf[rx_index-1]='\0';//命令后加空格与原命令等效;
                command_flag=1;
                rx_index=0;                             
            }
            else
            {
               rx_buf[0]='\0';   
               //command_flag=1;
               sendprocessing=1;
               control_write(UART1_BASE,0x0040);
               writeString("\r\n\x3e");
               writeChar('\0');
               sendcount=0;
            }
            break;
        }
        default:
        {
            if(recvchar==' '&&(rx_index==0||rx_buf[rx_index-1]==' '))
                return;
            else
            {
                if(rx_index<MAX_RECV_SIZE)
                {
                    if(echo)
                    {
                        uartSendChar(recvchar);
                    }
                    if(recvchar!='\n')
                    {
                        rx_buf[rx_index++]=recvchar;                        
                    }                
                }
            }
            break;
       }
    }
}

⌨️ 快捷键说明

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