打印
[STM8]

STM8 串口中断接收问题

[复制链接]
9560|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shaowei2072009|  楼主 | 2013-6-6 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
给位大大,我今天STM8的串口中断方式接收数据,本来的意图是接收完整个数据包在进行对数据包的第一个字节修改的,做了试验后发现我第一个字节接收完成后立即返回到main函数的while循环把第一个字节修改完,再次进入中断接收。
while(1)
  {
    if(RxBuffer[0] == 0x5A)
    {
      RxBuffer[0] = 0x5b;
      SendByte(RxBuffer[0]);
    }
  }
这样的话我下面的判断代码就不执行了。
if(RxBuffer[0] ==0x5A  && RxBuffer[RxNum-1] ==0xA5)
  {
    RxFlag =1;
  }
  if(RxFlag == 1)
  {
     for(i=0;i<RxNum;i++)
     {
         SendByte(RxBuffer[i]);
     }
     RxNum =0;
     RxFlag = 0;
  }
有什么办法可以等待数据包接收完在进入main函数。
沙发
grasswolfs| | 2013-6-6 11:04 | 只看该作者
本帖最后由 grasswolfs 于 2013-6-6 11:08 编辑

你的思路不对,每次接收就是一次中断,就得返回主程序,代码稍微改一下就行了。中断部分的程序你自己斟酌,主程序这样的

if(RxBuffer[0] ==0x5A  && RxBuffer[RxNum-1] ==0xA5)
  {
     RxBuffer[0] = 0x5b;
     for(i=0;i<RxNum;i++)
     {
         SendByte(RxBuffer);
     }
     RxNum =0;
  }

使用特权

评论回复
板凳
shaowei2072009|  楼主 | 2013-6-6 11:54 | 只看该作者
grasswolfs 发表于 2013-6-6 11:04
你的思路不对,每次接收就是一次中断,就得返回主程序,代码稍微改一下就行了。中断部分的程序你自己斟酌, ...

这样子肯定是没得问题的,中断每次都是接受一个数据,再返回主程序在接收的时候再去调用中断函数。我想做的是能不能让数据包接收完在返回主函数。这样做的话肯定会耗费CPU资源,只是想做个实验。你这个方法已经用过了。。

使用特权

评论回复
地板
grasswolfs| | 2013-6-6 13:08 | 只看该作者
本帖最后由 grasswolfs 于 2013-6-6 13:11 编辑
shaowei2072009 发表于 2013-6-6 11:54
这样子肯定是没得问题的,中断每次都是接受一个数据,再返回主程序在接收的时候再去调用中断函数。我想做 ...

如果能够深刻理解中断概念最早的设计者的初衷,我想就不会提出这样的问题了。就如同为了速度快我们发明了火车,然后我们研究如何让火车跑的慢一些。如果学有余力建议不要在这个问题上浪费时间了

使用特权

评论回复
5
shaowei2072009|  楼主 | 2013-6-6 14:08 | 只看该作者
grasswolfs 发表于 2013-6-6 13:08
如果能够深刻理解中断概念最早的设计者的初衷,我想就不会提出这样的问题了。就如同为了速度快我们发明了 ...

我是考虑到,每次接受到一个数据就返回,如果在返回的时候有其他的中断产生(比如我的按键)按键触发中断事件优先处理,那这时侯我串口才接到一个或者部分数据。这样子的话不是后面的数据有可能会丢失吗。(这只是我个人的猜想,并未做相关的实验,有不对之处还请包涵啊。只是今天做实验的时候偶尔想到的一个问题)

使用特权

评论回复
6
grasswolfs| | 2013-6-6 15:01 | 只看该作者
shaowei2072009 发表于 2013-6-6 14:08
我是考虑到,每次接受到一个数据就返回,如果在返回的时候有其他的中断产生(比如我的按键)按键触发中断 ...

如果有高优先级的中断,会中断低优先级的中断,也就是说,如果按键中断优先级高,你即使在接受数据中断里面,也会被按键中断中断的,所以这样的想法是不对的,按键可以不用中断的,用轮询

使用特权

评论回复
7
grasswolfs| | 2013-6-6 15:03 | 只看该作者
shaowei2072009 发表于 2013-6-6 14:08
我是考虑到,每次接受到一个数据就返回,如果在返回的时候有其他的中断产生(比如我的按键)按键触发中断 ...

串口数据为了保证准确性,可以增加串口自定义协议,增加CRC和错误重传

使用特权

评论回复
8
shaowei2072009|  楼主 | 2013-6-6 15:30 | 只看该作者
grasswolfs 发表于 2013-6-6 15:03
串口数据为了保证准确性,可以增加串口自定义协议,增加CRC和错误重传

这只是自己的一个想法,受教了。做的时候肯定不会这么做的。想法太多了

使用特权

评论回复
9
grasswolfs| | 2013-6-6 16:43 | 只看该作者
shaowei2072009 发表于 2013-6-6 15:30
这只是自己的一个想法,受教了。做的时候肯定不会这么做的。想法太多了 ...

我觉得例程也是很多人经验的积累,肯定是有道理的的

使用特权

评论回复
10
shaowei2072009|  楼主 | 2013-6-6 17:07 | 只看该作者
grasswolfs 发表于 2013-6-6 16:43
我觉得例程也是很多人经验的积累,肯定是有道理的的

是啊,这些都是我个人的想法,可能有点不切实际,多思考有不一样想法就做实验验证,主要还是为了更熟悉单片机的内部操作,怕到时候出现bug,现在考虑多一点以后可能就少点麻烦嘛!;P

使用特权

评论回复
11
grasswolfs| | 2013-6-6 17:41 | 只看该作者
shaowei2072009 发表于 2013-6-6 17:07
是啊,这些都是我个人的想法,可能有点不切实际,多思考有不一样想法就做实验验证,主要还是为了更熟悉单 ...

嗯,这也是挺好的,可以多试试,原来的想法是按照例程的话可以少走一些弯路

使用特权

评论回复
12
zjp8683463| | 2013-6-7 08:19 | 只看该作者
可以把接受到的数据再放入另一个buf里,是不是一个完整包,判断第二个buf里的数据就行了

使用特权

评论回复
13
figo20042005| | 2013-6-7 10:06 | 只看该作者
你在接收数据的时候,不要在主程序进行任何处理,把所有接收的数据都被放入缓冲区数组里后,再对数据做处理

使用特权

评论回复
14
power5000| | 2015-11-9 13:01 | 只看该作者
(RxBuffer[0] ==0x5A  && RxBuffer[RxNum-1] ==0xA5)

用这种来判断整个帧的接收完成????漏的厉害了

使用特权

评论回复
15
qxfuse| | 2015-11-10 11:52 | 只看该作者
中断里只保存数据,接受完了生成标志,最后在主程序里处理数据

使用特权

评论回复
16
diweo| | 2015-11-10 12:07 | 只看该作者
shaowei2072009 发表于 2013-6-6 11:54
这样子肯定是没得问题的,中断每次都是接受一个数据,再返回主程序在接收的时候再去调用中断函数。我想做 ...

STM32的话可以用DMA,STM8不清楚有没有。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

108

帖子

0

粉丝