查看: 7529|回复: 12

[讨论] K60 串口中断方式读取多字节数据

[复制链接]

该用户从未签到

29

主题

104

帖子

0

中级会员

Rank: 3Rank: 3

积分
355
最后登录
2019-1-28
发表于 2016-6-14 09:52:09 | 显示全部楼层 |阅读模式
大家好,我现在想用K60的串口中断方式读取多字节数据,以下是我写的串口中断服务程序和串口中断程序所调用的函数
串口中断服务程序如下
串口中断.png
所调用的函数如下:
串口读取数据.png
在调用的函数中,如果满足上图中的两个if中的任意一个,都会跳出这个函数。但是在我单步调试的时候出现了这种现象
QQ截图20160613222750.png
在满足第一个if语句时正常,if中的语句执行正常。但是在满足第二个if语句条件时,在执行完Receive_Flag=1;语句后,直接跳过了break语句(即没有执行break语句),然后跳出了循环,不知是什么原因。另外,如果我想实现上面所藐视的功能,这样写有没有什么不妥呢?还请大家指点一下。
回复

使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-6-14 10:25:47 | 显示全部楼层
    不用管包头包尾以及校验,接收完一包再处理,K60带IDLE中断,没收到一次数据计数器加1后缓存,全部完成后,在判断你所谓的包头包尾问题即可
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    355
    最后登录
    2019-1-28
     楼主| 发表于 2016-6-14 10:40:45 | 显示全部楼层
    技术范儿 发表于 2016-6-14 10:25
    不用管包头包尾以及校验,接收完一包再处理,K60带IDLE中断,没收到一次数据计数器加1后缓存,全部完成后, ...

    恩,我就是按照您的这个思路写的程序,但是不知道为什么运行时出了问题
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    355
    最后登录
    2019-1-28
     楼主| 发表于 2016-6-14 10:43:02 | 显示全部楼层
    我两个if语句的判断,是为了区分接收到的是响应还是数据,不是对一帧数据进行的判断。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-11-4 16:56
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    602

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1842
    最后登录
    2020-8-25
    发表于 2016-6-14 11:58:37 | 显示全部楼层
    break就是跳出循环啊,编译器会优化,但实际会马上跳出去。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    355
    最后登录
    2019-1-28
     楼主| 发表于 2016-6-14 13:41:40 | 显示全部楼层
    moyanming2013 发表于 2016-6-14 11:58
    break就是跳出循环啊,编译器会优化,但实际会马上跳出去。

    恩,谢谢您的指点,我不明白的是在我单步调试程序时,在执行第一个if语句时,其中的break语句是被执行的,然后跳出循环,但是在满足第二个if语句时,break语句没有被执行,就直接跳出了循环。是不是您说的经过编译器优化后,这个break就被优化掉了?然后在单步调试时,没有执行该句就直接跳出了循环?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24882
    最后登录
    2025-7-20
    发表于 2016-6-14 15:08:57 | 显示全部楼层
    天天都有好心情 发表于 2016-6-14 13:41
    恩,谢谢您的指点,我不明白的是在我单步调试程序时,在执行第一个if语句时,其中的break语句是被执行的 ...

    你第2个if,里面的代码有没有执行?
    也就是第二个if条件有没有成立呢?
    如果成立,里面的赋值语句应该被执行,然后跳出if,只要执行顺序正确就行了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    355
    最后登录
    2019-1-28
     楼主| 发表于 2016-6-14 15:32:36 | 显示全部楼层
    小恩GG 发表于 2016-6-14 15:08
    你第2个if,里面的代码有没有执行?
    也就是第二个if条件有没有成立呢?
    如果成立,里面的赋值语句应该被 ...

    可能我表述的不够清楚,我的意思是我在进行程序单步调试时,遇到的一个奇怪的问题:
    首先,当满足第一个if语句的条件时,应该跳进去执行这两句: QQ截图20160614152501.png
    然后跳出for循环,当满足第二个if语句的条件时,同样应该跳进去执行这两句

    然后跳出for循环。
    但现在的单步调试的现象为:当满足第一个if语句的条件时,这两句都执行了,
    当满足第二个if语句的条件时,只执行了这一句(Receive_Flag=1;),break;这一句没有被执行,然后就直接跳出了循环,
    我不明白的是,为什么break语句没有被执行?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24882
    最后登录
    2025-7-20
    发表于 2016-6-15 09:36:24 | 显示全部楼层
    天天都有好心情 发表于 2016-6-14 15:32
    可能我表述的不够清楚,我的意思是我在进行程序单步调试时,遇到的一个奇怪的问题:
    首先,当满足第一个i ...

    这个应该和IDE的编译器有关,不过你看功能其实也是执行了break才跳出for的,否则也不会跳出。
    另外,楼主你这个中断中做的事情太多了。
    中断中直接接受数据,然后加个标量就行了,不要做太多的处理,也不建议你再嵌套函数进去,可以直接写在中断服务函数中。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    355
    最后登录
    2019-1-28
     楼主| 发表于 2016-6-15 10:48:07 | 显示全部楼层
    小恩GG 发表于 2016-6-15 09:36
    这个应该和IDE的编译器有关,不过你看功能其实也是执行了break才跳出for的,否则也不会跳出。
    另外,楼主 ...

    恩,您指点的很对,这个问题我刚刚也发现了,我也感觉自己在中断中做的事情太多,所以我想着只在中断中接收数据,对数据的解析与判断单独写成一个函数,我是这样改的, QQ截图20160615104300.png
    主函数中是这样的
    QQ截图20160615104331.png
    但是现在的问题是,我不知道怎么把中断中的累加变量i的值实时传递出来,我程序中是这样写的,但是运行后,只能中断接收一个字节,不能中断接收多个字节了,还麻烦您给指点下。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 23:51 , Processed in 0.110116 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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