是单片机的串口接收中断吗?要设置中断标志位呀,串口接收方式也要对呀,设置波特率。
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++
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)