📄 uart.c
字号:
Comm1RxInIx = 0; // 进入索引复位
}
}
break;
case IIR_CTI: // -- 中断标志 超时
U1IER = U1IER & (~0x01); // 禁止接收及字符超时中断 暂时未处理
break;
case IIR_THRE: // -- 中断标志 发送数据
if (Comm1TxBufCtr > 0) { // 检查发送消息缓存区是否为空 不为空则继续发数据
Comm1TxBufCtr--; // 缓存计数器减1
U1THR = Comm1TxBuf[Comm1TxOutIx++]; // 读走一个数据到发送寄存器
if (Comm1TxOutIx >= COMM1_TXD_SIZE) { // 判断
Comm1TxOutIx = 0; // 复位
}
} else {
Comm1bCanSend = 0; // 发送标志为0表示 可以直接发送信息
}
break;
default : // 未定义
break;
}
VICVectAddr = 0; // Acknowledge Interrupt
OS_EXIT_CRITICAL(); //
}
#endif
/********************************************************************************************************
* 功 能 : 串口1读1则数据
* 入 口 : 'err' 返回错误信息的指针
* 返 回 : 1> 读到的数据
* 2> err=COMM_RXD_EMPTY 接收缓存没有数据
* 3> err=COMM_RXD_OK 正确在接收缓存读到数据
* 说 明 : 1> 在调用此函数前 最好用Comm1RxGetNMsgs函数检查一下接收缓存里面有没有信息
* 2> 如果不按1>的用法用 则要对返回的错误代码分析
********************************************************************************************************/
#if COMM1_UNIT_EN > 0 && COMM1_RXD_EN > 0 && COMM1_RXD_GET_EN > 0
INT8U Comm1RxGetChar (INT8U *err)
{
INT8U msg;
*err = COMM_RXD_EMPTY; /* 返回代码为接收为空 */
COMM_ENTER_CRITICAL(); /* 进入临界 */
if (Comm1RxBufCtr > 0) { /* 检测接收缓存是否有数据 */
Comm1RxBufCtr--; /* 有数据计数器减1 */
msg = Comm1RxBuf[Comm1RxOutIx++]; /* 取出数据 */
*err = COMM_RXD_OK; /* 返回代码为读数据正确 */
if (Comm1RxOutIx >= COMM1_RXD_SIZE) { /* 检查出数据计数器 是否大于最大接收缓存 */
Comm1RxOutIx = 0; /* 是复位出数据计数器 */
}
}
COMM_EXIT_CRITICAL(); /* 退出临界 */
return (msg);
}
#endif
/********************************************************************************************************
* 功 能 : 检测接收缓存中的数据个数
* 入 口 : 无
* 返 回 : 缓存中的数据个数
* 说 明 : 无
********************************************************************************************************/
#if COMM1_UNIT_EN > 0 && COMM1_RXD_EN > 0 && COMM1_RXD_GETNMSGS_EN > 0
INT16U Comm1RxGetNMsgs (void)
{
COMM1_RXD_TYPE counter;
COMM_ENTER_CRITICAL(); /* 进入临界 */
counter = Comm1RxBufCtr; /* 取接收计数器数据 */
COMM_EXIT_CRITICAL(); /* 退出临界 */
return (counter); /* 返回接收缓存计数 */
}
#endif
/********************************************************************************************************
* 功 能 : 一次串口0读N则数据
* 入 口 : 'p' 返回数据信息的指针
* 'len' 读的数据长度 < COMM1_RXD_SIZE
* 返 回 : 1> COMM_RXD_EMPTY 读数据为空 一般是len为空 或接收缓存中没有数据
* 2> COMM_RXD_FALSE 错误读数据 一般为len大于数据接收缓存中的数据
* 3> COMM_RXD_OK 数据正确读到
* 说 明 : 1> 对于返回参数2> 可以使用Comm1RxGetNMsgs 先取得缓存中的数据个数再一次读走
********************************************************************************************************/
#if COMM1_UNIT_EN > 0 && COMM1_RXD_EN > 0 && COMM1_RXD_GETS_EN > 0
INT8U Comm1RxGetsChar (INT8U *s, COMM1_RXD_TYPE len)
{
COMM_ENTER_CRITICAL(); /* 进入临界 处理Comm1RxBufCtr */
if ((len == 0) || (Comm1RxBufCtr == 0)) { /* 检查数据长度 和接收缓存是否为空 */
COMM_EXIT_CRITICAL(); /* 退出临界 */
return (COMM_RXD_EMPTY); /* 返回代码为接收空 */
}
if (len > Comm1RxBufCtr) { /* 检查读数长度跟实际接收缓存数据个数 */
COMM_EXIT_CRITICAL(); /* 退出临界 */
return (COMM_RXD_FALSE); /* 返回代码为 读数据失败 */
}
COMM_EXIT_CRITICAL(); /* 退出临界 */
/* 必须退出临界以便其他的中断响应 否则len大时就会影响中断*/
while (len--) { /* 读走len个数据 */
COMM_ENTER_CRITICAL(); /* 进入临界 处理Comm1RxBufCtr */
*s++ = Comm1RxBuf[Comm1RxOutIx++]; /* 取出数据 */
Comm1RxBufCtr--; /* 接收缓存计数器减1 */
if (Comm1RxOutIx >= COMM1_RXD_SIZE) { /* 处理接收出数据计数器 */
Comm1RxOutIx = 0; /* 复位出数据计数器 */
}
COMM_EXIT_CRITICAL(); /* 退出临界 */
}
return (COMM_RXD_OK); /* 返回代码为 接收到正确数据 */
}
#endif
/********************************************************************************************************
* 功 能 : 来不及发送的消息进入发送缓存
* 入 口 : 'Data' 进入缓存的消息数据
* 返 回 : 1> COMM_TXD_FLOODL 发送消息进入缓存满 (失败)
* 2> COMM_TXD_OK 发送消息进入缓存OK
* 说 明 : 1> 内部模式 用户不能调用
********************************************************************************************************/
#if COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0
static void Comm1TxInBuf (INT8U Data)
{
if (Comm1TxBufCtr < COMM1_TXD_SIZE) { /* 处理发送缓存计数器 */
Comm1TxBufCtr++; /* 发送缓存计数器加1 */
Comm1TxBuf[Comm1TxInIx++] = Data; /* 来不及发送的数据进发送缓存 */
if (Comm1TxInIx >= COMM1_TXD_SIZE) { /* 处理发送进缓存计数器 */
Comm1TxInIx = 0; /* 复位发送进缓存计数器 */
}
}
}
#endif
/********************************************************************************************************
* 功 能 : COMM1 发送1 BYTE数据
* 入 口 : 'Date' 发送的数据
* 返 回 : 1> COMM_TXD_OK 发送数据OK
* 2> COMM_TXD_FALSE 发送失败 一般是发送缓存已满
* 说 明 : 1> SBUF发送寄存器为空时直接把要发送的数据放到发送缓存
* 2> SBUF发送寄存器为忙时来不及发的数据进入到发送缓存
* 3> 发送缓存满时直接返回发送失败
********************************************************************************************************/
#if COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0 && COMM1_TXD_PUT_EN > 0
INT8U Comm1TxPutChar (INT8U Data)
{
COMM_ENTER_CRITICAL(); /* 进入临界 */
if (!Comm1bCanSend) { /* 判断串口直接发送允许标志位 0为允许 */
Comm1bCanSend = 1; /* 设置为忙 */
U1THR = Data; /* 发送出数据 */
COMM_EXIT_CRITICAL(); /* 退出临界 */
return (COMM_TXD_OK); /* 返回代码为发送OK */
}
if (Comm1TxBufCtr >= COMM1_TXD_SIZE) { /* 判断发送缓存计数器是否为最大发送缓存 */
COMM_EXIT_CRITICAL(); /* 是退出临界 不处理 */
return (COMM_TXD_FALSE); /* 发送缓存满 返回代码为发送失败 */
} else {
Comm1TxInBuf(Data); /* 来不及发送的数据一直等到进入发送缓存 */
COMM_EXIT_CRITICAL(); /* 退出临界 */
return (COMM_TXD_OK); /* 返回代码为发送OK */
}
}
#endif
/********************************************************************************************************
* 功 能 : COMM1 发送N BYTE数据
* 入 口 : 'p' 指向发送消息的指针
* 'len' 发送数据的长度
* 返 回 : 1> 实际已经发送的数据长度
* 说 明 : 1> 返回实际发送数据的长度 对剩下的字节 就需要用户自己处理
********************************************************************************************************/
#if COMM1_UNIT_EN > 0 && COMM1_TXD_EN > 0 && COMM1_TXD_PUTS_EN > 0
INT8U Comm1TxPutsChar (INT8U *s, COMM1_TXD_TYPE len)
{
COMM1_TXD_TYPE i;
COMM_ENTER_CRITICAL(); // 进入临界
i = COMM1_TXD_SIZE - Comm1TxBufCtr; // 剩下的发送缓存长度
i = i >= len ? len : i; // 处理实际发送数据长度
len = i; // 实际已经发送的数据长度
while (i--) { // 发送数据处理
if (!Comm1bCanSend) { // 检测直接发送条件
Comm1bCanSend = 1; // 可以 置直接发送标志为忙
U1THR = *s; // 发送数据
} else { // 理解下面的指令实际就是变相的while(!TI)
Comm1TxInBuf(*s); // 发送不了的数据进入发送缓存
}
s++; //
}
COMM_EXIT_CRITICAL(); // 退出临界
return (len); // 返回实际已经发送的数据长度
}
#endif
#endif
/********************************************************************************************************
* End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -