- #include
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char flag,a,i;
- uchar b[4];
- uchar code table[]="I get ";
- void init()
- {
- TMOD=0x20; //确定T1的工作方式
- TH1=0xfd; //计算T1的初值,装载TH1,TL1
- TL1=0xfd;
- TR1=1; //启动T1
- REN=1; //确定串行口的工作方式
- SM0=0;
- SM1=1;
- EA=1;
- ES=1;
- }
- void main()
- {
- init();
- while(1)
- {
- if(flag==1)
- {
- ES=0; //关闭串口中断,否则发送数据时同样申请中断,程序进入死循环
- for(i=0;i<6;i++)
- {
- SBUF=table[i];
- while(!TI);
- TI=0;
- }
- for(i=0;i<4;i++)
- {
- SBUF=b[i];
- while(!TI); //发送完毕后,TI会被硬件置1,跳出循环,说明数据发送完毕
- TI=0; //
- }
- ES=1;
- flag=0;
- }
- }
- }
- void ser() interrupt 4
- {
- uchar j;
- for(j=0;j<4;j++)
- {
- while(!RI);
- RI=0; //接受数据完成后,内部硬件置1,进入串口中断函数后
- b[j]=SBUF;
- } //必须有软件清0
- flag=1; //将flag置1,方便在主程序中检测
- }
现在用串口助手发送字符的时候,如果一次输入正好是4个字符,那么程序时没有错误的
但如果每次输入了2个字符,那么点击发送键后,串口助手是没有显示的,因为中断函数里的j还没有到4,
这样就需要发送2次,串口助手才会收到字符
但如果每次发送3个字符的话,第一次依然没有显示,但第二次发送后会保留多余的字符到b[j],这样以后再一次发送4个字符的话,串口助手以后收到的字符就会和发送的有点出入
求修改!
如果输入少于4个字符,下次发送的时候,可以把b[]里保存的字符清空
如果输入大于4个字符,下子发送的事业,也可以把b[]里多保存的字符清空
最好在中断函数里修改后发出来