股票

iPhone端wifi小车C51下位机串口机制

之前串口程序总是有问题,或者只能接收第一个字符,可以进行响应动作;或者根本没响应,就跟串口断线一样;或者一发送字符就进入假死机状态,输出端口全置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 清零,串口只接收第一个数据,就不再接收之后的了。

附串口源程序:

  1. //未在程序中定义的均为全局变量
  2. void inituart(void//串口初始化
  3. {
  4. SCON = 0x50; //方式1, 8位数据位,允许接收
  5. TMOD |= 0x20; //设置TIMER1: timer1,方式2;timer0,方式1
  6. PCON |= 0x00; //SMOD=0
  7. TH1 = 0xfd; // TH1: reload value for 9600 baud @ 11.0592MHz
  8. TR1 = 1; // TIMER1开始计数
  9. ES = 1; //允许串行口中断
  10. PS = 1; //设置串行口中断为高优先级中断
  11. ENABLE_INT; //开放中断
  12. }
  13. void com_isr() interrupt 4 //串行口中断服务程序
  14. {
  15. unsigned char temp;
  16. DISABLE_INT; //屏蔽所有中断
  17. if(RI) //如果是接收到数据引起中断
  18. {
  19. RI = 0; // RI清零
  20. temp = SBUF; //读接收到的数据到temp
  21. switch(temp)
  22. {
  23. case 0x41:p2mark=0xF5;break;//字符‘A’
  24. case 0x42:p2mark=0xF9;break;//字符‘B’
  25. case 0x43:p2mark=0xF6;break;//字符‘C’
  26. case 0x44:p2mark=0xFA;break;//字符‘D’
  27. case 0x45:p2mark=0xF0;break;//字符‘E’
  28. default:break;
  29. }
  30. }
  31. if(TI)TI=0;
  32. ENABLE_INT; //开放中断
  33. }
打赏
原文链接:,转发请注明来源!

发表评论