求助,如何使用单片机串口中断,读取串口数据并传递到主函数
目的:使用中断方式读取串口收到的数据,并将数据传递到主函数中
硬件:STC12C5A60S2 12M晶振
软件:keil V2
示范例,主函数中有参数a进行运算,当串口有中断时,将串口收到的数据(暂定为b)加到a上
代码如下,现象:参数从串口中断中得到的b传递不到主函数中,运行时候主函数的b一直是0.求解
- #include<STC12C5A60S2.H>
- #define unchar unsigned char
- /*串口初始化函数
- 无参数
- 无返回值
- */
- void ser_ini()
- { TMOD=0x20;//设置定时器1工作方式2
- TH1=0xfd;//定时器初值
- TL1=0xfd;
- TR1=1;//打开定时器
- SM0=0;//设置串口工作方式
- SM1=1;//设置串口工作方式
- REN=1;//串口允许接受打开
- }
- /*主函数
- 无参数
- 无返回值
- */
- void main()
- {
- unchar a=0;
- unchar b=0;
- EA=1;//打开总中断
- ES=1;//打开串口中断
- ser_ini();//串口初始化
- if(!RI){
- RI=0;
- a=a+b;
- }
- }
- /*串口中断函数
- 无参数
- 返回值不知道如何搞
- */
- void ser_inter() interrupt 4//串口中断
- {
- unchar b;
- b=SBUF;
- }
接收完成会置RI=1,你这if(!RI),接收完了也进不去呀!
unchar counter=0;
unchar buffer[200];
void ser_inter() interrupt 4//串口中断
{
counter++;
buffer[counter]=SBUF;
if(counter>=200)
counter=0;
}
您的意思是定义一个全局变量,然后串口数据改变全局变量的值?
好的,我看看,我还没注意
这样最简单,当然也可以用指针。
我试了,全局变量不太管用,依旧调不出来
#include<reg51.h>
#define uchar unsigned uchar
#define uint unsigned uint
char over;
void send(char receive)
{
SBUF=receive;
while(TI==0);
TI=0;
}
void main()
{
char a;
TMOD=0X20; //TI定时方式
TH1=TL1=0Xfd; //波特率9600
PCON=0; //波特率不加倍
SCON=0x50; //串口通信方式1,TI\RI清零,允许接收
TR1=1; //启动T1
EA=1;
ES=1;
a=0x01;
P2=a+receive;
}
/***************************************************
函数名称:ser()interrupt 4
函数功能:中断程序
输入参数:无
输出参数:无
***************************************************/
void ser()interrupt 4
{
static unsigned char i;//串口接收计数的变量
over=0;
RI=0;//手动清某个寄存器,大家都懂的
receive=SBUF;
send(receive);
ES=0;
}
我就是这么做的,依旧白扯