专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
串口通信做成同步发送
2019-07-26 16:23
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
12936
14
1464
异步接收的模式这样可行吗?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
hnkf118
1楼-- · 2019-07-28 14:07
51就随便做,什么叫做中断中不能清楚TI标志? 没懂?那我的程序还就是在中断方式,而且还清了中断标志呢。。。。
加载中...
hnkf118
2楼-- · 2019-07-28 16:25
/********************************************************************************************************
* 功 能 : UART 串口中断响应函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1>
********************************************************************************************************/
#if UART_UNIT_EN > 0 && (UART_RXD_EN > 0 || UART_TXD_EN > 0)
void ISR_Uart (void) interrupt UART_INT_VECTOR
{
if (TI0) { // 发送数据处理 如果发送缓存为空 则置发送标志为允许状态
u8_t temp;
TI0 = 0; //
#if UART_TXD_EN > 0
if (UartTxBufCnt > 0) { // 检查发送消息缓存区是否为空 不为空则继续发数据
UartTxBufCnt--; // 缓存计数器减1
temp = UartTxBuf[UartTxOutIx]; // 读走一个数据到发送寄存器
#if UART_CHECK_MODE > 0
__disable_irq(); // 禁止中断
ACC = temp; // 计算奇偶校验位
TB80 = P; // 奇偶校验位
SBUF0 = temp;
__enable_irq(); // 开启中断
#endif
if (++UartTxOutIx >= UART_TXD_SIZE) { //
UartTxOutIx = 0; //
}
} else {
UartTxbCan = FALSE; // 发送标志为0表示 可以直接发送信息
}
#endif
}
if (RI0) { // 接收到的数据直接进缓存 由应用程度读缓存得到需要的数据
u8_t temp = SBUF0; //
RI0 = 0; // 清除接收中断标志
#if UART_CHECK_MODE > 0 // 奇偶校验
__disable_irq();
ACC = temp;
if ( P != RB80) {
#if UART_RXD_EN > 0
if (UartRxBufCnt < UART_RXD_SIZE) { //
UartRxBufCnt++; // 接收缓存计数器加1
UartRxBuf[UartRxInIx] = temp; // 接收到的数据进缓存
if (++UartRxInIx >= UART_RXD_SIZE) { //
UartRxInIx = 0; //
}
}
#endif // UART_RXD_EN
}
__enable_irq();
#else // UART_CHECK_MODE
#if UART_RXD_EN > 0
if (UartRxBufCnt < UART_RXD_SIZE) { //
UartRxBufCnt++; // 接收缓存计数器加1
UartRxBuf[UartRxInIx] = temp; // 接收到的数据进缓存
if (++UartRxInIx >= UART_RXD_SIZE) { //
UartRxInIx = 0; //
}
}
#endif
}
#endif // UART_CHECK_MODE
}
}
#endif
/********************************************************************************************************
* 功 能 : UART 发送1BYTE数据
* 入 口 : 'Dat' 发送的数据
* 返 回 : 1> UART_TXD_OK 发送数据OK
* 2> UART_TXD_FALSE 发送失败 一般是发送缓存已满
* 说 明 : 1> SBUF发送寄存器为空时直接把要发送的数据放到发送寄存器
* 2> SBUF发送寄存器为忙时来不及发的数据进入到发送缓存
* 3> 发送缓存满时直接返回发送失败
********************************************************************************************************/
#if UART_UNIT_EN > 0 && UART_TXD_EN > 0 && UART_TXD_CHAR_EN > 0
u8_t UartTxPutChar (u8_t Dat)
{
UART_ENTER_CRITICAL(); // 进入临界
if (!UartTxbCan) { // 判断串口直接发送允许标志位 0为允许
UartTxbCan = TRUE; // 设置为忙
#if UART_CHECK_MODE == 0
SBUF0 = Dat; // 发送出数据
#else
__disable_irq(); // 禁止中断
ACC = Dat; // 计算奇偶校验位
TB80 = P; // 奇偶校验位
__enable_irq(); // 开启中断
SBUF0 = Dat; // 发送出数据
#endif
UART_EXIT_CRITICAL(); // 退出临界
return (UART_TX_NO_ERR); // 返回代码为发送OK
}
if (UartTxBufCnt < UART_TXD_SIZE) { // 判断发送缓存计数器是否为最大发送缓存
UartTxInBuf(Dat); // 来不及发送的数据一直等到进入发送缓存
UART_EXIT_CRITICAL(); // 退出临界
return (UART_TX_NO_ERR); // 返回代码为发送OK
}
UART_EXIT_CRITICAL(); // 是退出临界 不处理
return (UART_TXD_FALSE); // 发送缓存满 返回代码为发送失败
}
#endif
加载中...
上一页
1
2
3
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
携手ADI,踏上电子工程师之巅—车辆电气化视频,答题领奖!
1 个回答
如何提升论坛质量,看你了!
20 个回答
【最终名单】二姨家喊你来拿100份新年大礼啦~
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
* 功 能 : UART 串口中断响应函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1>
********************************************************************************************************/
#if UART_UNIT_EN > 0 && (UART_RXD_EN > 0 || UART_TXD_EN > 0)
void ISR_Uart (void) interrupt UART_INT_VECTOR
{
if (TI0) { // 发送数据处理 如果发送缓存为空 则置发送标志为允许状态
u8_t temp;
TI0 = 0; //
#if UART_TXD_EN > 0
if (UartTxBufCnt > 0) { // 检查发送消息缓存区是否为空 不为空则继续发数据
UartTxBufCnt--; // 缓存计数器减1
temp = UartTxBuf[UartTxOutIx]; // 读走一个数据到发送寄存器
#if UART_CHECK_MODE > 0
__disable_irq(); // 禁止中断
ACC = temp; // 计算奇偶校验位
TB80 = P; // 奇偶校验位
SBUF0 = temp;
__enable_irq(); // 开启中断
#endif
if (++UartTxOutIx >= UART_TXD_SIZE) { //
UartTxOutIx = 0; //
}
} else {
UartTxbCan = FALSE; // 发送标志为0表示 可以直接发送信息
}
#endif
}
if (RI0) { // 接收到的数据直接进缓存 由应用程度读缓存得到需要的数据
u8_t temp = SBUF0; //
RI0 = 0; // 清除接收中断标志
#if UART_CHECK_MODE > 0 // 奇偶校验
__disable_irq();
ACC = temp;
if ( P != RB80) {
#if UART_RXD_EN > 0
if (UartRxBufCnt < UART_RXD_SIZE) { //
UartRxBufCnt++; // 接收缓存计数器加1
UartRxBuf[UartRxInIx] = temp; // 接收到的数据进缓存
if (++UartRxInIx >= UART_RXD_SIZE) { //
UartRxInIx = 0; //
}
}
#endif // UART_RXD_EN
}
__enable_irq();
#else // UART_CHECK_MODE
#if UART_RXD_EN > 0
if (UartRxBufCnt < UART_RXD_SIZE) { //
UartRxBufCnt++; // 接收缓存计数器加1
UartRxBuf[UartRxInIx] = temp; // 接收到的数据进缓存
if (++UartRxInIx >= UART_RXD_SIZE) { //
UartRxInIx = 0; //
}
}
#endif
}
#endif // UART_CHECK_MODE
}
}
#endif
/********************************************************************************************************
* 功 能 : UART 发送1BYTE数据
* 入 口 : 'Dat' 发送的数据
* 返 回 : 1> UART_TXD_OK 发送数据OK
* 2> UART_TXD_FALSE 发送失败 一般是发送缓存已满
* 说 明 : 1> SBUF发送寄存器为空时直接把要发送的数据放到发送寄存器
* 2> SBUF发送寄存器为忙时来不及发的数据进入到发送缓存
* 3> 发送缓存满时直接返回发送失败
********************************************************************************************************/
#if UART_UNIT_EN > 0 && UART_TXD_EN > 0 && UART_TXD_CHAR_EN > 0
u8_t UartTxPutChar (u8_t Dat)
{
UART_ENTER_CRITICAL(); // 进入临界
if (!UartTxbCan) { // 判断串口直接发送允许标志位 0为允许
UartTxbCan = TRUE; // 设置为忙
#if UART_CHECK_MODE == 0
SBUF0 = Dat; // 发送出数据
#else
__disable_irq(); // 禁止中断
ACC = Dat; // 计算奇偶校验位
TB80 = P; // 奇偶校验位
__enable_irq(); // 开启中断
SBUF0 = Dat; // 发送出数据
#endif
UART_EXIT_CRITICAL(); // 退出临界
return (UART_TX_NO_ERR); // 返回代码为发送OK
}
if (UartTxBufCnt < UART_TXD_SIZE) { // 判断发送缓存计数器是否为最大发送缓存
UartTxInBuf(Dat); // 来不及发送的数据一直等到进入发送缓存
UART_EXIT_CRITICAL(); // 退出临界
return (UART_TX_NO_ERR); // 返回代码为发送OK
}
UART_EXIT_CRITICAL(); // 是退出临界 不处理
return (UART_TXD_FALSE); // 发送缓存满 返回代码为发送失败
}
#endif
一周热门 更多>