找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于STC8G单片机串口1发送数据不全的问题

查看数: 2268 | 评论数: 8 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-8-30 09:40

正文摘要:

①我用的是STC8G1K08单片机; ②目的:按下并松开按键(完成一次完整的按键动作)后,向电脑屏幕发送准备好的数组; ③数组:0x01~07 和 0x07~01 两个数组 ④出现的问题:发送的数据不全,屏幕显示 01 06 05 04 0 ...

回复

ID:861694 发表于 2023-8-30 17:22
lkc8210 发表于 2023-8-30 16:58
SBUF = T1BUF[0]这行代码只是开始发送
离发送完毕,开启串口1发送中断-->TI = 1 还有一段时间
于是就继 ...

竟然还有这中情况吗?给SBUF赋值完8位数据后,TI并不会马上置1是吗?while(F_T1_OK)就是限制程序将Ce_Arry1( );全部赋值给SBUF后,才执行Ce_Arry2( );吗?
ID:161164 发表于 2023-8-30 16:58
戡拤 发表于 2023-8-30 16:44
谢谢,这行while语句直接救命!我是这样理解这段代码的,SBUF = T1BUF[0]这行代码就是开启串口1发送中断- ...

SBUF = T1BUF[0]这行代码只是开始发送
离发送完毕,开启串口1发送中断-->TI = 1 还有一段时间
于是就继续往下运行Ce_Arry2();

while(F_T1_OK)没有语句块,但中断里154行有

评分

参与人数 1黑币 +15 收起 理由
戡拤 + 15 感谢解答!

查看全部评分

ID:861694 发表于 2023-8-30 16:44

谢谢,这行while语句直接救命!我是这样理解这段代码的,SBUF = T1BUF[0]这行代码就是开启串口1发送中断-->TI = 1,既然进入了串口中断,不应该是把剩下的0x2-6逐一赋值给SBUF吗?可是现实执行效果是直接跳出了中断,执行了第二个S1OUT( ),请问可以告诉我哪里考虑有误吗?还有while(F_T1_OK)没有语句块,为啥可以跳出循环呀,可以解释一下吗吗?
ID:161164 发表于 2023-8-30 16:13
  1. //串口发送程序
  2. void S1OUT(void)
  3. {
  4.         if(F_T1_OK==0)                        //串口1中断空闲
  5.         {
  6.                 F_T1_OK = 1;                //串口1处于中断中
  7.                 SBUF = T1BUF[0];        //进入串口1中断
  8.         }
  9.                 while(F_T1_OK);
  10. }
复制代码


评分

参与人数 1黑币 +15 收起 理由
戡拤 + 15 万分感谢!

查看全部评分

ID:861694 发表于 2023-8-30 14:46
Hephaestus 发表于 2023-8-30 14:30
问题出在118~121行,119行只发送了一个字节就进入下一行了。

我的理解是S1OUT( );中,F_T1_OK=1,之后进入串口1发送中断,直到将测试数组1全部发完,如果不是这样考虑的话,请问该往哪个方向想?
ID:883242 发表于 2023-8-30 14:30
问题出在118~121行,119行只发送了一个字节就进入下一行了。

评分

参与人数 1黑币 +10 收起 理由
戡拤 + 10 的确是此函数有问题

查看全部评分

ID:123289 发表于 2023-8-30 13:48
逻辑时序混乱。
ID:861694 发表于 2023-8-30 11:48
我想要的效果是按下按键后,显示屏显示:01 02 03 04 05 06 07 07 06 05 04 03 02 01 ,但是现实效果却是01 06 05 04 03 02 01,而且开头的01还是测试数组1的 0x01,不知道哪里出错了。。。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表