zoukankan      html  css  js  c++  java
  • lPC1788的串口通讯

    #ifndef __DEBUGSERIAL_H_

    #define __DEBUGSERIAL_H_

    #include "sys.h"

    #include "stdio.h"

     

     

    extern u8 serialBuffer[256];

    extern u16 serialStatus;

     

    //ڰ

     

    void Debug_Serial_Init(u32 baud);

     

    void Debug_Serial_Send_Byte(u8 dat);

     

    void Debug_Serial_Send_Buffer(u8 length,u8* buffer);

     

    #endif

     

     

     

     

     

     

    #include "debugSerial.h"

     

    //加入printf支持

    #pragma import(__use_no_semihosting)                            

    struct __FILE

    {

        int handle;

        /* Whatever you require here. If the only file you are using is */

        /* standard output using printf() for debugging, no file handling */

        /* is required. */

    };

    FILE __stdout;      

    _sys_exit(int x)

    {

        x = x;

    } 

    int fputc(int ch, FILE *f)

    {     

        while(!((LPC_UART0->LSR) & 0x20));      //等待判断LSR[5](即THRE)是否是1,1时表示THR中为空     

        LPC_UART0->THR = (u8)ch;                    //发送数据    

        return ch;

    }

     

     

     

     

     

     

     

    //定义一个256字节的缓冲区用于存放接收到的串口数据信息

    //定义一个16位数据同时保存接收数据长度以及接收数据的状态

    u8 serialBuffer[256] = {0};

    u16 serialStatus = 0;

    //16字节的状态

    //低八位为当前存储的有效数据长度

    //15位为接收完成等待处理标志

    //8位表示当前已经接受到回车符

    //第9到十四位表示在等待处理期间系统冗余发送的数据量

    //用于后期通讯系统的负载自适应

     

     

     

    void TransSerialsCommand(u8 res)

    {

        u8 lostCount;

        u8 receiveCount;

        //接收数据处理

        if(serialStatus & (1<<15))//已经接收完成,这个数据被抛弃

        {

            lostCount = ((u8)(serialStatus>>9))&0x3f;//漏掉的数据计数

            if(lostCount < 0x3f)lostCount++;

            serialStatus &= ~(0x3f<<9);

            serialStatus |= (lostCount<<9);

        }

        else//上一个命令没有接收完

        {

            if(serialStatus & (1<<8))//接收到

            {

                //等待接收N

                if(res == ' ')

                {

                    //接收完成

                    serialStatus |= 0x8000;

                }

                else//不是 ,这一次命令作废

                {

                    serialStatus = 0;

                }

            }

            else//没收到

            {

                if(res == ' ')

                {

                    serialStatus |= 0x0100;

                }

                else

                {

                    receiveCount = (u8)(serialStatus&0xff);

                    if(receiveCount < 255)

                    {

                        serialBuffer[receiveCount] = res;

                        receiveCount++;

                        serialStatus &= 0xff00;

                        serialStatus |= receiveCount;

                    }

                    else

                    {

                        //数据溢出,清空

                        serialStatus = 0;

                    }

                }

            }

           

        }

    }

     

     

     

     

     

     

     

    void UART0_IRQHandler(void)

    {

        u8 status = 0;

        u8 res = 0;

        //清除串口中断挂起

        NVIC_ClearPendingIRQ(GPIO_IRQn);

        //清除串口接收中断

        if(!(LPC_UART0->IIR & 0x01))//确认有中断发生

        {

            status = LPC_UART0->IIR & 0x0e;

            if(status == 0x04)//确认是RDA中断

            {

                //读取串口接收值

                res = (LPC_UART0->RBR&0xff);

                //处理串口接收值

                TransSerialsCommand(res);

            }

        }

       

       

       

       

    }

     

     

    void Debug_Serial_Init(u32 baud)

    {

        LPC_SC->PCONP |= (1<<3)|(1<<15);                //打开时钟

        //配置io口

        LPC_IOCON->P0_2 = 0x00;                         //选择TXD功能,禁止迟滞 不反向 正常推挽

        LPC_IOCON->P0_2 |= (1<<0)|(2<<3);               //上拉

     

        LPC_IOCON->P0_3 = 0x00;                         //选择RXD功能,禁止迟滞 不反向 正常推挽

        LPC_IOCON->P0_3 |= (1<<0)|(2<<3);               //上拉

       

        LPC_UART0->LCR = 0x83;                          //设置串口数据格式,8位字符长度,1个停止位,无校验,使能除数访问

       

        LPC_UART0->DLM = ((ApbClock/16)/baud) / 256;    //除数高八位  , 没有小数情况

        LPC_UART0->DLL = ((ApbClock/16)/baud) % 256;    //除数第八位

       

        LPC_UART0->LCR = 0x03;                          //禁止访问除数锁存器,锁定波特率

       

        LPC_UART0->FCR  = 0x00;                         //禁止FIFO

       

        LPC_UART0->IER = 0x01;                          //使能接收中断RDA

        NVIC_EnableIRQ(UART0_IRQn);                     //打开IRQ中断

    }

     

    void Debug_Serial_Send_Byte(u8 dat)

    {

        //当检测到UARTn THR已空时,THRE就会立即被设置。写UnTHR会清零THRE

        //0  -  UnTHR包含有效字符

        //1  -  UnTHR为空

        while(!((LPC_UART0->LSR) & 0x20));      //等待判断LSR[5](即THRE)是否是1,1时表示THR中为空     

        LPC_UART0->THR = dat;                   //发送数据

    }

     

    void Debug_Serial_Send_Buffer(u8 length,u8* buffer)

    {

        u8 i = 0;

        for(i = 0; i < length; i++)

        {

            Debug_Serial_Send_Byte(buffer[i]);

        }

        printf(" ");

    }

     

     

     

  • 相关阅读:
    一步一步自定义SpringMVC参数解析器
    Git客户端TortoiseGit(Windows系统)的使用方法
    Tiles入门和Tiles 框架和体系结构
    SpringMVC整合Tiles框架
    JQuery和JSON方式参数传递并处理JAVAWEB中文乱码问题
    spring mvc接收JSON格式的参数
    Spring MVC Controller与jquery ajax请求处理json
    扩展SpringMVC以支持绑定JSON格式的请求参数
    SpringMVC从Control中响应json数据
    JSONP 教程
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4338702.html
Copyright © 2011-2022 走看看