📄 a.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 + -