之前串口程序总是有问题,或者只能接收第一个字符,可以进行响应动作;或者根本没响应,就跟串口断线一样;或者一发送字符就进入假死机状态,输出端口全置0;还有就是用 if 可以执行程序,换了 switch 就不行了。总之状况五花八门,经过这两天的调试,终于明白串口通信的大致流程了,若有不对的地方请指正。
1,通讯机制。程序先在main函数的while(1)中循环,当有串口数据到来时,硬件将RI置1,同时程序转入串口中断函数,即 void com_isr() interrupt 4 。执行完串口中断函数后,程序回到while(1)中继续循环。
2,switch问题。switch语句中return和break是有区别的,return是退出整个函数,即void com_isr() interrupt 4 ,所有switch后的语句都不在执行;而break只退出当前switch循环。
3,TI 问题。整个只是知其然,而不知道为什么要这样。就是接收完串口数据后,要把TI置0,进入准备发送数据状态,思考原因可能是当TI=1时,串口准备进行发送,而不再进行数据接收。但是我的程序没有进行TI置1操作,可能是硬件某时间将 TI 置1了。反正是,少了 TI 清零,串口只接收第一个数据,就不再接收之后的了。
附串口源程序:
- //未在程序中定义的均为全局变量
- void inituart(void) //串口初始化
- {
- SCON = 0x50; //方式1, 8位数据位,允许接收
- TMOD |= 0x20; //设置TIMER1: timer1,方式2;timer0,方式1
- PCON |= 0x00; //SMOD=0
- TH1 = 0xfd; // TH1: reload value for 9600 baud @ 11.0592MHz
- TR1 = 1; // TIMER1开始计数
- ES = 1; //允许串行口中断
- PS = 1; //设置串行口中断为高优先级中断
- ENABLE_INT; //开放中断
- }
- void com_isr() interrupt 4 //串行口中断服务程序
- {
- unsigned char temp;
- DISABLE_INT; //屏蔽所有中断
- if(RI) //如果是接收到数据引起中断
- {
- RI = 0; // RI清零
- temp = SBUF; //读接收到的数据到temp
- switch(temp)
- {
- case 0x41:p2mark=0xF5;break;//字符‘A’
- case 0x42:p2mark=0xF9;break;//字符‘B’
- case 0x43:p2mark=0xF6;break;//字符‘C’
- case 0x44:p2mark=0xFA;break;//字符‘D’
- case 0x45:p2mark=0xF0;break;//字符‘E’
- default:break;
- }
- }
- if(TI)TI=0;
- ENABLE_INT; //开放中断
- }