串口接收中断进不去,如何解决

串口接收中断进不去,如何解决,第1张

串口接收中断进不去,如何解决?

是单片机的串口接收中断吗?要设置中断标志位呀,串口接收方式也要对呀,设置波特率。

SCON=0X50

EA=1

ES=1

TMOD=0X20

TH1=0xfd

TL1=0xfd

TR1=1

还要写串口中断程序,这样,当串口接收到数据就会进入中断程序了。

当MCU接收到GPS发来的一个

字节

时触发中断,进入中断程序,(在进入中断程序时串口照样接收,中断程序是往串口

缓存

区读的数据,并且读数据时相当快的,永远不用担心还在读的时候数据被新来的给覆盖了)将该接收的字节提取出放在一个

缓冲区

内,缓冲区是你自己

定义

的一个

数组

字符串

,谁你喜好,如你所述GPS是每隔1秒发送一次数据的,此时你可以在

主程序

中设计当0.5秒没有接收到GPS所发的数据时,就将缓冲区内的数据读出处理,并清空缓冲区,这样其实中断程序只管

接收数据

主函数

只管处理数据,两不相冲。

快下班了,给你一个思维吧

声明一个数组来缓存数据,声明一个变量来顺序接收,在声明一个定时器中断变量来判断一帧数据是否接收完成.

unsigned char ucUartRecv_Arr[256]

unsigned char ucUartRecv_Cnt = 0 //顺序接收数据

unsigned char ucTimer0_Cnt = 0 //定时器1MS计数

unsigned char ucUartRecv_Flag = 0 //接收完成标志

void 定时器 1MS中断()

{

if(ucUartRecv_Flag != 0)

{

ucUartRecv_Flag --

if(ucUartRecv_Flag == 0)

{

ucUartRecv_Flag = 1 //一帧数据接收完成标志

}

}

}

void 接收中断函数()

{

ucUartRecv_Flag = 3 //3MS 就说明接收完成

ucUartRecv_Arr[ucUartRecv_Cnt] = SBUF //51为例

ucUartRecv++

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7691640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存