
#include <string.h>
unsigned char ch
bit read_flag= 0
void init_serialcom( void )
{
SCON = 0x50 //SCON: serail mode 1, 8-bit UART, enable ucvr
//UART为模式1,8位数据,允许接收
TMOD |= 0x20 //TMOD: timer 1, mode 2, 8-bit reload
//定时器1为模式2,8位自动重装
PCON |= 0x80 //SMOD=1
TH1 = 0xFD //Baud:19200 fosc="11".0592MHz
IE |= 0x90 //Enable Serial Interrupt
TR1 = 1 // timer 1 run
TI=1
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch
while (TI== 0)
TI= 0
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0
ch=SBUF
read_flag= 1 //就置位取数标志
}
}
main()
{
init_serialcom()//初始化串口
while ( 1 )
{
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag= 0 //取数标志清0
send_char_com(ch)
}
}
}
这个程序由四部分组成
init_serialcom( void ) //初始化串口
send_char_com( unsigned char ch) //向串口发送字符
serial () interrupt 4 using 3//中断串口接收字符
main() //主函数
当MCU接收到GPS发来的一个字节时触发中断,进入中断程序,(在进入中断程序时串口照样接收,中断程序是往串口缓存区读的数据,并且读数据时相当快的,永远不用担心还在读的时候数据被新来的给覆盖了)将该接收的字节提取出放在一个缓冲区内,缓冲区是你自己定义的一个数组或字符串,谁你喜好,如你所述GPS是每隔1秒发送一次数据的,此时你可以在主程序中设计当0.5秒没有接收到GPS所发的数据时,就将缓冲区内的数据读出处理,并清空缓冲区,这样其实中断程序只管接收数据,主函数只管处理数据,两不相冲。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)