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

📄 a.txt

📁 适用于EasyDSP/index.htm >ARM2131(2132芯片) UART串口字符串接收程序( 适用实时系统) 程序: 1.能一次接收大批量字符串数
💻 TXT
字号:
适用于EasyDSP/index.htm'>ARM2131(2132芯片)
UART串口字符串接收程序( 适用实时系统) 
  程序:  1.能一次接收大批量字符串数,
          2.采用了查寻方式,在实时系统中CPU占用率低
          3.波特率适应范围较宽
  

程序中OsTastDelay(); 

主要程序如下:
// 预定义
#define UART_BPS  115200                                         // 波特率设置

uint8 str[1024 * 5 + 1];                                         // 定义接收缓冲


/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率UART_BPS。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_Init (void)
{
    uint16 Fdiv;
    PINSEL0 = 0x00000005;                          // 设置I/O连接到UART0
    U0LCR = 0x83;                          // DLAB=1,允许设置波特率
    Fdiv  = (Fpclk / 16) / UART_BPS;                      // 设置波特率
    U0DLM = Fdiv / 256;
    U0DLL = Fdiv % 256;
                               
    U0LCR = 0x03;
    U0FCR = 0x01;                                             // FIFO使能
}

/*
*********************************************************************************************************
** 函数名称 :void UART_GetData(uint8 *dataSp, uint32 depth)
** 函数功能 :从串口接收数据到指定地址单元,并形成字符串。
** 入口参数 :接收缓存区首地址 dataSP,缓冲区的大小 depth = 实际深度 - 1
** 出口参数 :未超过缓冲区返回“1”,超过返回“0”
** 说    明 :该函数由缓冲区的大小决定一次可以接收的数据量
**            当一次性发送数据超过缓冲区大小时,将会造成丢失
              
** 串口的配置:
**            串口最高速率为115200,最低为2400,使能FIFO,
**              
**              本处理是靠查寻中断标志与线状态寄存器
**
**    OsTaskDelay(1);系统延时1ms
**
*********************************************************************************************************
*/
uint32 UART0_GetData(uint8 *dataSp, uint32 depth)
{
  uint32 i = 0;                                                              // 计数
  
  while (1)
  {
                                                                          // 等待接收数据
      
      #if UART_BPS < 19200                          // 针对低波特率条件编译
         OsTaskDelay(10);
      #else 
         OsTaskDelay(1); 
      #endif
     

      if ( ((U0IIR & 0x0d) != 0x0c) & ((U0LSR & 0x01) == 0) & (i != 0) )
         {
         *dataSp = 0;
         return (1);                         // 当接收完所有数据时
         }
      if ((U0IIR & 0x0d) == 0x0c)                     // 检测字符超时标志接收完成
         {
         while (U0LSR & 0x01)                     // 当U0RBR包含数据时
           {
            *dataSp++ = U0RBR;
               i++;
            if (i == depth) return (0);       
           }
            if (i < depth)                     // 未超过缓冲
                {
                *dataSp = 0;                 // 完成字符串结束标志
                return (1);                     // 接收成功
                 }
         }

      while (U0LSR & 0x01)                         // 当U0RBR包含数据时
       {
        *dataSp++ = U0RBR;
           i++;       
           if (i == depth) return (0);                             // 当超过缓冲区大小 返回零
       }
      
  }
}

/*
*********************************************************************************************************
** 函数名称 :UART0_SendData()
** 函数功能 :串口字符串发送
** 入口参数 :str   要发送的字符串的指针
**            n     是否需要换行,大于0时换行
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendData (uint8 const *str, uint8 n)
{
    uint32 i; 
    while (1)
    {
       for (i=0; i<14; i++)                           // 一次最多填充14字节
        {
          if (*str == '\0')    break;                           // 遇到结束符,退出
          U0THR = *str++;
        }
        while ((U0LSR & 0x40) == 0)                   // 等待发送完成
        OsTaskDelay(1);                                           
        
        if (*str == '\0')    break;
    }

    if (n > 0)
    {                                   // 换行
    UART0_SendByte(13);
    UART0_SendByte(10);
    }
}


// 调用

{
   UART0_Init();                                                           // 初始化
   UART0_GetData(str, 1024*5);                                             // 接收 
   UART0_SendData(str, 1);                                                 // 回送校验

}

以下是 UART串口字符串接收程序( 适用实时系统,请大家帮忙测试一下) 相关回复 
回复 第1楼:
没人顶我自己顶一下 顺便改正一下我昨天抄错了的地方
有哪位高手知道为什么,我的KEIL里复制文字到记事本都是乱码(我的机子是英文版XP,uVisin 3)

uint32 UART0_GetData(uint8 *dataSp, uint32 depth)
{
  uint32 i = 0;                                                              // 计数
  
  while (1)
  {
                                                                          // 等待接收数据
      
      #if UART_BPS < 19200                          // 针对低波特率条件编译
         OsTaskDelay(10);
      #else 
         OsTaskDelay(1); 
      #endif
     

      if ( ((U0IIR & 0x0d) != 0x0c) & ((U0LSR & 0x01) == 0) & (i != 0) )
         {
         *dataSp = 0;
         return (1);                         // 当接收完所有数据时
         }
      if ((U0IIR & 0x0d) == 0x0c)                     // 检测字符超时标志接收完成
         {
         while (U0LSR & 0x01)                     // 当U0RBR包含数据时
           {
            *dataSp++ = U0RBR;
               i++;
            if (i == depth) 
               {
                *dataSp = 0;                   // /// 这里丢了一条
                return (0);
                }       
           }
            if (i < depth)                     // 未超过缓冲
                {
                *dataSp = 0;                 // 完成字符串结束标志
                return (1);                     // 接收成功
                 }
         }

      while (U0LSR & 0x01)                         // 当U0RBR包含数据时
       {
        *dataSp++ = U0RBR;
           i++;       
           if (i == depth) 
        {
                *dataSp = 0;                   // /// 这里丢了一条
                return (0);
                }                   // 当超过缓冲区大小 返回零
       }
      
  }
}

⌨️ 快捷键说明

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