GPRS.c
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:22k
源码类别:

GPS编程

开发平台:

C/C++

  1. /****************************************Copyright (c)**************************************************
  2. **                               广州周立功单片机发展有限公司
  3. **                                     研    究    所
  4. **                                        产品一部 
  5. **
  6. **                                 http://www.zlgmcu.com
  7. **
  8. **--------------文件信息--------------------------------------------------------------------------------
  9. **文   件   名: GPRS.c
  10. **创   建   人: 叶皓贲
  11. **最后修改日期: 2005年7月4日
  12. **描        述: μCOS-II下LPC2000的GPRS底层驱动 
  13. **              
  14. **--------------历史版本信息----------------------------------------------------------------------------
  15. ** 创建人: Yehaoben
  16. ** 版  本: v1.0
  17. ** 日 期: 2007年2月25日
  18. ** 描 述: 原始版本
  19. **
  20. **------------------------------------------------------------------------------------------------------
  21. ** 修改人:
  22. ** 版  本:
  23. ** 日 期:
  24. ** 描 述:
  25. **
  26. **--------------当前版本修订------------------------------------------------------------------------------
  27. ** 修改人: 
  28. ** 日 期: 
  29. ** 描 述: 
  30. **
  31. **------------------------------------------------------------------------------------------------------
  32. ********************************************************************************************************/
  33. #define  IN_MODEM
  34. #include  "config.h"
  35. #define   GPRS_TASK_STK_SIZE                  128
  36. OS_STK      GPRSTaskStartStk[GPRS_TASK_STK_SIZE];
  37. static  OS_EVENT *ModemSem, *Uart1Send, *Uart1Get,*HaveCall;
  38. static  uint8 ModemState;
  39. /*********************************************************************************************************
  40. ** 函数名称: UART1Init
  41. ** 功能描述: 初始化UART0 
  42. ** 输 入: bps:波特率
  43. **
  44. ** 输 出:TRUE  :成功
  45. **        FALSE:失败
  46. ** 全局变量: Uart0Sem
  47. ** 调用模块: OSSemCreate
  48. **
  49. ** 作 者: 陈明计
  50. ** 日 期: 2004年2月25日
  51. **-------------------------------------------------------------------------------------------------------
  52. ** 修改人: 
  53. ** 日 期: 
  54. **-------------------------------------------------------------------------------------------------------
  55. ** 修改人: 陈明计
  56. ** 日 期: 
  57. **------------------------------------------------------------------------------------------------------
  58. ********************************************************************************************************/
  59.         void UART1Init(uint32 bps)
  60. {
  61.     uint16 Fdiv;
  62.     
  63.     PINSEL0 = (PINSEL0 & 0x0000ffff) | 0x55550000;  /* 选择管脚为UART0 */
  64.     U1LCR = 0x80;                                   /* 允许访问分频因子寄存器 */
  65.     Fdiv = (Fpclk / 16) / bps;                      /* 设置波特率 */
  66.     U1DLM = Fdiv / 256;
  67. U1DLL = Fdiv % 256;
  68.     U1LCR = 0x03;                                   /* 禁止访问分频因子寄存器 */
  69.                                                     /* 且设置为8,1,n */
  70. U1IER = 0x0f;                                   /* 允许接收和发送中断 */
  71.     U1FCR = 0x87;                                   /* 初始化FIFO */
  72.     U1MCR = 0x03;
  73.     Uart1Send = OSSemCreate(1);
  74.     Uart1Get = OSSemCreate(0);
  75. }
  76. /*********************************************************************************************************
  77. ** 函数名称: GetModemState
  78. ** 功能描述: 获取MODEM状态
  79. ** 输 入: 无
  80. **        
  81. ** 输 出: MODEM状态
  82. ** 全局变量: 无
  83. ** 调用模块: 无
  84. **
  85. ** 作 者: 陈明计
  86. ** 日 期: 2004年2月25日
  87. **-------------------------------------------------------------------------------------------------------
  88. ** 修改人:
  89. ** 日 期:
  90. **------------------------------------------------------------------------------------------------------
  91. ********************************************************************************************************/
  92.         uint8 GetModemState(void)
  93. {
  94.     return ModemState;
  95. /*********************************************************************************************************
  96. ** 函数名称: ModemWrite
  97. ** 功能描述: 发送多个字节数据
  98. ** 输 入: Data:发送数据存储位置
  99. **        NByte:发送数据个数
  100. ** 输 出:无
  101. ** 全局变量: 无
  102. ** 调用模块: UART0Putch
  103. **
  104. ** 作 者: 陈明计
  105. ** 日 期: 2004年2月25日
  106. **-------------------------------------------------------------------------------------------------------
  107. ** 修改人:
  108. ** 日 期:
  109. **------------------------------------------------------------------------------------------------------
  110. ********************************************************************************************************/
  111.         uint8 ModemWrite(char *Data, uint16 NByte)
  112. {
  113.     uint8 err,i;
  114.     
  115.     while (NByte > 0)
  116.     {
  117.         OSSemPend(Uart1Send, 0, &err);
  118.         for (i = 0; i < 8; i++)
  119.         {
  120.             U1THR = *Data++;
  121.             NByte--;
  122.             if (NByte == 0)
  123.             {
  124.                 break;
  125.             }
  126.         }
  127.     }
  128.     return ModemState;
  129. /*********************************************************************************************************
  130. ** 函数名称: UART0Getch
  131. ** 功能描述: 接收一个字节
  132. ** 输 入: 无
  133. ** 输 出: 接收到的数据
  134. ** 全局变量: 无
  135. ** 调用模块: 无
  136. **
  137. ** 作 者: 陈明计
  138. ** 日 期: 2004年2月25日
  139. **-------------------------------------------------------------------------------------------------------
  140. ** 修改人:
  141. ** 日 期:
  142. **------------------------------------------------------------------------------------------------------
  143. ********************************************************************************************************/
  144.         uint8 ModemGetch(void)
  145. {
  146.     uint8 rt;
  147.     OS_ENTER_CRITICAL();
  148.     while ((U1LSR & 0x00000001) == 0)
  149.     {                                           /* 没有收到数据 */
  150.         U1IER = U1IER | 0x01;                   /* 允许接收中断 */
  151.         OSSemPend(Uart1Get,OS_TICKS_PER_SEC/2, &rt);
  152.         
  153.         break;
  154.     }
  155.     if(rt == OS_TIMEOUT)
  156.      rt = 0;
  157.     else
  158.      rt = U1RBR;                                 /* 读取收到的数据 */
  159.     OS_EXIT_CRITICAL();
  160.     return rt;
  161. /*********************************************************************************************************
  162. ** 函数名称: GetAllChar
  163. ** 功能描述: 接收当前的所有字节
  164. ** 输 入: 无
  165. ** 输 出: 无
  166. ** 全局变量: 无
  167. ** 调用模块: 无
  168. **
  169. ** 作 者: Yehaoben
  170. ** 日 期: 2005年2月25日
  171. **-------------------------------------------------------------------------------------------------------
  172. ** 修改人:
  173. ** 日 期:
  174. **------------------------------------------------------------------------------------------------------
  175. ********************************************************************************************************/
  176. void GetAllChar()
  177. {
  178. uint8 i,j;
  179. OS_ENTER_CRITICAL();
  180. U1IER = U1IER | 0x01;                   /* 允许接收中断 */
  181. OS_EXIT_CRITICAL();
  182. for (i = 0; i < 120; i++)
  183.     {
  184.      j = ModemGetch();
  185.      if (j == 0)
  186.      break;
  187.         
  188.     }
  189. }
  190. /*********************************************************************************************************
  191. ** 函数名称: ModemDialUp
  192. ** 功能描述: 通过modem拨号 
  193. ** 输 入: 电话号码
  194. **
  195. ** 输 出: modem状态
  196. **
  197. ** 全局变量: ModemState
  198. ** 调用模块: ModemWrite,OSTimeDly
  199. **
  200. ** 作 者: Yehaoben
  201. ** 日 期: 2005年2月25日
  202. **-------------------------------------------------------------------------------------------------------
  203. ** 修改人: 
  204. ** 日 期: 
  205. **-------------------------------------------------------------------------------------------------------
  206. ********************************************************************************************************/
  207.         uint8 ModemDialUp(char Number[])
  208. {
  209.     char *cp;
  210.     uint8 i;
  211.     uint8 err;
  212.     OSSemPend(ModemSem, 0, &err);
  213.     if (ModemState == MODEM_CLOSE)
  214.     {
  215.         while ((U1LSR & 0x00000001) != 0)
  216.         {
  217.             err = U1RBR;
  218.         }
  219.         ModemWrite("ATD", 3);
  220.         i = 0;
  221.         cp = Number;
  222.         while (*cp++ != 0)
  223.         {
  224.             i++;
  225.         }
  226.         ModemWrite(Number, i);
  227.         ModemWrite("rn", 2);
  228.         GetAllChar();
  229.     }
  230.     OSSemPost(ModemSem);
  231.     return ModemState;
  232. }
  233. /*********************************************************************************************************
  234. ** 函数名称: ModemDialDown
  235. ** 功能描述: 挂断modem 
  236. ** 输 入: 无
  237. **
  238. ** 输 出: modem状态
  239. **
  240. ** 全局变量: ModemState
  241. ** 调用模块: OSTimeDly
  242. **
  243. ** 作 者: 陈明计
  244. ** 日 期: 2004年2月25日
  245. **-------------------------------------------------------------------------------------------------------
  246. ** 修改人: 
  247. ** 日 期: 
  248. **-------------------------------------------------------------------------------------------------------
  249. ********************************************************************************************************/
  250.         uint8 ModemDialDown(void)
  251. {
  252.     U1MCR = 0x02;
  253.     OSTimeDly(OS_TICKS_PER_SEC / 10);
  254.     U1MCR = 0x03;
  255.     OSTimeDly(OS_TICKS_PER_SEC / 10);
  256.     return ModemState;
  257. }
  258. /*********************************************************************************************************
  259. ** 函数名称: ModemCommand
  260. ** 功能描述: 向modem发送命令 
  261. ** 输 入: 命令字符串
  262. **
  263. ** 输 出: modem状态
  264. **
  265. ** 全局变量: ModemState
  266. ** 调用模块: ModemWrite,ModemGetch,
  267. **
  268. ** 作 者: yehaoben
  269. ** 日 期: 2005年2月25日
  270. **-------------------------------------------------------------------------------------------------------
  271. ** 修改人: 
  272. ** 日 期: 
  273. **-------------------------------------------------------------------------------------------------------
  274. ********************************************************************************************************/
  275.         uint8 ModemCommand(char *Command)
  276. {
  277.     uint8 i,err;
  278.     uint16 j;
  279.     OSSemPend(ModemSem, 0, &err);
  280.     GetAllChar();
  281.     if (ModemState == MODEM_CLOSE)
  282.     {
  283.         while(1)
  284.         {
  285.         while ((U1LSR & 0x00000001) != 0)
  286.         {
  287.             err = U1RBR;
  288.         }
  289.         ModemWrite("ATrn", 4);
  290.         i = ModemGetch();
  291.         j = 0;
  292.         while ( j <= 20 )
  293.         {
  294.             err = i;
  295.             i = ModemGetch();
  296.             if (err == 'O' || err == 'o')
  297.             if (i == 'K' || i == 'k')
  298.             {
  299.                 i = ModemGetch();
  300.                 i = ModemGetch();
  301.                 break;
  302.             }
  303.             if( (i == 0) && (j == 3) )
  304.             {
  305.              j=20;
  306.             }
  307.             j++;
  308.         }
  309.         if(j >=20 )
  310.          {
  311.          continue;
  312.          }
  313.          else
  314.          break;
  315.         }
  316.        
  317.         ModemWrite(Command, strlen(Command));
  318.         ModemWrite("rn", 2);
  319.         i = ModemGetch();
  320.         while (1)
  321.         {
  322.             err = i;
  323.             i = ModemGetch();
  324.             if (err == 'O' || err == 'o')
  325.             if (i == 'K' || i == 'k')
  326.             {
  327.                 i = ModemGetch();
  328.                 i = ModemGetch();
  329.                 break;
  330.             }
  331.         }
  332.         GetAllChar();
  333.         
  334.     }
  335.     OSSemPost(ModemSem);
  336.     return ModemState;
  337. }
  338. /*********************************************************************************************************
  339. ** 函数名称: GPRSCheckTask
  340. ** 功能描述: GPRS检查是否有电话来和检查是否有新的短信。
  341. ** 输 入: 无
  342. **
  343. ** 输 出: 无
  344. **
  345. ** 全局变量: ModemState
  346. ** 调用模块: UART1Init,OSTimeDly,ModemCommand,
  347. **
  348. ** 作 者: Yehaoben
  349. ** 日 期: 2005年7月2日
  350. **-------------------------------------------------------------------------------------------------------
  351. ** 修改人: 
  352. ** 日 期: 
  353. **-------------------------------------------------------------------------------------------------------
  354. ********************************************************************************************************/
  355.         void  GPRSCheckTask(void *pdata)
  356. {
  357. uint8 i,err,temp[3];
  358. while(1)
  359. {
  360. OSTimeDly(OS_TICKS_PER_SEC*2);
  361. OSSemPend(ModemSem, 0, &err);
  362. do
  363. {
  364. i = ModemGetch();
  365. if( i == 'R' )
  366. {
  367. temp[0] = ModemGetch(); 
  368. temp[1] = ModemGetch(); 
  369. temp[2] = ModemGetch(); 
  370. if( temp[0] == 'I' )
  371. if( temp[1] == 'N' )
  372. if( temp[2] == 'G' )
  373. OSSemPost(HaveCall);
  374. }
  375. }while( i != 0 );
  376. OSSemPost(ModemSem);
  377. }
  378. }
  379. /*********************************************************************************************************
  380. ** 函数名称: ModemInit
  381. ** 功能描述: 初始化Modem 
  382. ** 输 入: 波特率
  383. **
  384. ** 输 出: modem状态
  385. **
  386. ** 全局变量: ModemState
  387. ** 调用模块: UART1Init,OSTimeDly,ModemCommand,
  388. **
  389. ** 作 者: Yehaoben
  390. ** 日 期: 2005年2月25日
  391. **-------------------------------------------------------------------------------------------------------
  392. ** 修改人: 
  393. ** 日 期: 
  394. **-------------------------------------------------------------------------------------------------------
  395. ********************************************************************************************************/
  396.         uint8 ModemInit(uint32 bps)
  397. {
  398.     ModemState = MODEM_CLOSE;
  399.     UART1Init(bps);
  400.     ModemSem = OSSemCreate(1);
  401.     HaveCall = OSSemCreate(0);
  402.     if (ModemSem != NULL)
  403.     {
  404.         if ((U1MSR & 0x30) != 0x30)
  405.         {
  406.             OSTimeDly(OS_TICKS_PER_SEC);
  407.             if ((U1MSR & 0x30) != 0x30)
  408.             {
  409.                 ModemState = NOT_FIND_MODEM;
  410.             }
  411.         }
  412.         if (ModemState == MODEM_CLOSE)
  413.         {
  414.             ModemCommand("AT$NOSLEEP=1");
  415.             ModemCommand("AT+CREG=1");
  416.         }
  417.         //OSTaskCreate(GPRSCheckTask, (void *)0, &GPRSTaskStartStk[GPRS_TASK_STK_SIZE - 1], 7);
  418.     }
  419.     else
  420.     {
  421.         ModemState = NOT_INIT_MODEM;
  422.     }
  423.     return ModemState;
  424. }
  425. /*********************************************************************************************************
  426. ** 函数名称: GPRSSendMSG
  427. ** 功能描述: 发短信
  428. ** 输 入: 短信地址,短信信息
  429. **
  430. ** 输 出: 成功 0 失败1
  431. **
  432. ** 全局变量: 
  433. ** 调用模块: 
  434. **
  435. ** 作 者: Yehaoben
  436. ** 日 期: 2005年7月1日
  437. **-------------------------------------------------------------------------------------------------------
  438. ** 修改人: 
  439. ** 日 期: 
  440. **-------------------------------------------------------------------------------------------------------
  441. ********************************************************************************************************/
  442. const char GPRS_MSG_STR[]={"AT+CMGS="%s"rn"};
  443. uint8 GPRSSendMSG(char * num, char * MSG)
  444. {
  445. uint8 i,j,err;
  446. char sendchar[30];
  447. char temp[2];
  448. ModemCommand("AT+CMGF=1");
  449. OSSemPend(ModemSem, 0, &err);
  450. GetAllChar();
  451. _sprintf(sendchar,GPRS_MSG_STR,num);
  452. ModemWrite(sendchar,strlen(sendchar));
  453. i = ModemGetch();
  454.     j = 0;
  455.     while ( j <= 30 )
  456.     {
  457.         if (i == '>')
  458.         {
  459.             break;
  460.         }
  461.         i = ModemGetch();
  462.         j++;
  463.     }
  464. if(j >=30 )
  465. {
  466. OSSemPost(ModemSem);
  467. return 1;
  468. }
  469. ModemWrite(MSG,strlen(MSG));
  470. temp[1]=0;
  471. temp[0]=0x1a;
  472. ModemWrite(temp,1);
  473. i = ModemGetch();
  474.     j = 0;
  475.     OSTimeDly(OS_TICKS_PER_SEC*3);
  476.     GetAllChar();
  477. GetAllChar();
  478. OSSemPost(ModemSem);
  479. return 0;
  480. }
  481. /*********************************************************************************************************
  482. ** 函数名称: GPRSAutoTakeTheCall
  483. ** 功能描述: 接电话
  484. ** 输 入: 无
  485. **
  486. ** 输 出: 成功 0 失败1
  487. **
  488. ** 全局变量: 
  489. ** 调用模块: 
  490. **
  491. ** 作 者: Yehaoben
  492. ** 日 期: 2005年7月1日
  493. **-------------------------------------------------------------------------------------------------------
  494. ** 修改人: 
  495. ** 日 期: 
  496. **-------------------------------------------------------------------------------------------------------
  497. ********************************************************************************************************/
  498. uint8 GPRSAutoTakeTheCall()
  499. {
  500. uint8 err;
  501. OSSemPend(HaveCall, OS_TICKS_PER_SEC*2, &err);
  502. if(err == OS_NO_ERR)
  503. {
  504. ModemCommand("ATA");
  505. return 0;
  506. }
  507. else
  508. return 1;
  509. }
  510. /*********************************************************************************************************
  511. ** 函数名称: GPRSTakeTheCall
  512. ** 功能描述: 接电话
  513. ** 输 入: 无
  514. **
  515. ** 输 出: 成功 0 失败1
  516. **
  517. ** 全局变量: 
  518. ** 调用模块: 
  519. **
  520. ** 作 者: Yehaoben
  521. ** 日 期: 2005年7月1日
  522. **-------------------------------------------------------------------------------------------------------
  523. ** 修改人: 
  524. ** 日 期: 
  525. **-------------------------------------------------------------------------------------------------------
  526. ********************************************************************************************************/
  527. uint8 GPRSTakeTheCall()
  528. {
  529. ModemCommand("ATA");
  530. return 0;
  531. }
  532. /*********************************************************************************************************
  533. ** 函数名称: GPRSHangUpTheCall
  534. ** 功能描述: 挂电话
  535. ** 输 入: 无
  536. **
  537. ** 输 出: 成功 0 失败1
  538. **
  539. ** 全局变量: 
  540. ** 调用模块: 
  541. **
  542. ** 作 者: Yehaoben
  543. ** 日 期: 2005年7月1日
  544. **-------------------------------------------------------------------------------------------------------
  545. ** 修改人: 
  546. ** 日 期: 
  547. **-------------------------------------------------------------------------------------------------------
  548. ********************************************************************************************************/
  549. uint8 GPRSHangUpTheCall()
  550. {
  551. ModemCommand("AT+CHUP");
  552. return 0;
  553. }
  554. /*********************************************************************************************************
  555. ** 函数名称: GPRSDelMSG
  556. ** 功能描述: 删除短信
  557. ** 输 入: num 短信的存储号(1~20)
  558. **
  559. ** 输 出: 成功 0 失败1
  560. **
  561. ** 全局变量: 
  562. ** 调用模块: 
  563. **
  564. ** 作 者: Yehaoben
  565. ** 日 期: 2005年7月1日
  566. **-------------------------------------------------------------------------------------------------------
  567. ** 修改人: 
  568. ** 日 期: 
  569. **-------------------------------------------------------------------------------------------------------
  570. ********************************************************************************************************/
  571. const char GPRS_DELMSG_STR[]={"AT+CMGD=%drn"};
  572. uint8 GPRSDelMSG(uint8 num)
  573. {
  574. char sendchar[15];
  575. GetAllChar();
  576. _sprintf(sendchar,GPRS_DELMSG_STR,num);
  577. ModemCommand(sendchar);
  578. return 0;
  579. }
  580. /*********************************************************************************************************
  581. ** 函数名称: GPRSReadMSG
  582. ** 功能描述: 读短信
  583. ** 输 入: 短信号码,对发号码,短信内容
  584. **
  585. ** 输 出: 成功 0 失败1
  586. **
  587. ** 全局变量: 
  588. ** 调用模块: 
  589. **
  590. ** 作 者: Yehaoben
  591. ** 日 期: 2005年7月1日
  592. **-------------------------------------------------------------------------------------------------------
  593. ** 修改人: 
  594. ** 日 期: 
  595. **-------------------------------------------------------------------------------------------------------
  596. ********************************************************************************************************/
  597. const char GPRS_RCVMSG_STR[]={"AT+CMGR=%drn"};
  598. uint8 GPRSReadMSG(uint8 num,char * number,char * MSG )
  599. {
  600. char sendchar[15];
  601. char i,j;
  602. uint8 err;
  603. GetAllChar();
  604. ModemCommand("AT+CMGF=1");
  605. OSSemPend(ModemSem, 0, &err);
  606. _sprintf(sendchar,GPRS_RCVMSG_STR,num);
  607. ModemWrite(sendchar,strlen(sendchar));
  608. i = ModemGetch();
  609. j = 0;
  610.     while ( j <= 5  )
  611.     {
  612.         if (i == 0x2c)
  613.         {
  614.             break;
  615.         }
  616.         i = ModemGetch();
  617.         if(i == 0)
  618.          j++;
  619.     }
  620.     if( j >=5 )
  621.     {
  622.      OSSemPost(ModemSem);
  623.      return 1;
  624.     }
  625. i = ModemGetch();//for "
  626. i=0;
  627. do//save number
  628. {
  629. number[i] = ModemGetch();
  630. i++;
  631. }while(number[i-1] != 0x22);
  632. number[i-1] = 0;
  633. err = 0;
  634. i = ModemGetch();
  635. while ( err <= 5 )//find the MSG
  636.     {
  637.      j = i;
  638.         i = ModemGetch();
  639.         if (j == 0x0d)
  640.         if (i == 0x0a)
  641.         {
  642.             break;
  643.         }
  644.         if(i ==  0)
  645.          err++;
  646.     }
  647.     
  648.     j = 0;
  649.     err = 0;
  650.     MSG[0] = ModemGetch();
  651.     MSG[0] = ModemGetch();
  652.     while ( err <= 5 )//Save the MSG
  653.     {
  654.         MSG[j+1] = ModemGetch();
  655.         //if ( (i == 'O') || (i == 'o') )
  656.         //if ( (MSG[j] == 'K') || (MSG[j] == 'k') )
  657. if ( (MSG[j] == 0x4f) || (MSG[j] == 0x6f) )
  658.         if ( (MSG[j+1] == 0x4b) || (MSG[j+1] == 0x6b) )
  659.         {
  660.             i = ModemGetch();
  661.             i = ModemGetch();
  662.             break;
  663.         }
  664.         if(MSG[j+1] ==  0)
  665.          err++;
  666.         else
  667.          j++;
  668.     }
  669.     if( j > 0 )
  670.     {
  671.      for(i = 0; i < j ; i++ )
  672.      {
  673.      if(MSG[i] == 0x0d )
  674.      if(MSG[i+1] == 0x0a )
  675.      if((MSG[i+2] == 0x4f) || (MSG[i+2] == 0x6f) )
  676.          if((MSG[i+3] == 0x4b) || (MSG[i+3] == 0x6b) )
  677.          {
  678.          MSG[i] = 0;
  679.          break;
  680.          }
  681.      }
  682.      OSSemPost(ModemSem);
  683.      return 0;
  684.     }
  685.     OSSemPost(ModemSem);
  686. return 1;
  687. }
  688. /*********************************************************************************************************
  689. ** 函数名称: UART1_Exception
  690. ** 功能描述: UART1中断服务程序
  691. ** 输 入: 无
  692. **
  693. ** 输 出: 无
  694. **         
  695. ** 全局变量: ModemState
  696. ** 调用模块: OSSemPost
  697. **
  698. ** 作 者: 陈明计
  699. ** 日 期: 2004年2月25日
  700. **-------------------------------------------------------------------------------------------------------
  701. ** 修改人:
  702. ** 日 期:
  703. **------------------------------------------------------------------------------------------------------
  704. ********************************************************************************************************/
  705.         void UART1_Exception(void)
  706. {
  707.     uint8 IIR, temp;
  708.     
  709.     OS_ENTER_CRITICAL();
  710.     while(((IIR = U1IIR) & 0x01) == 0)
  711.     {                                                   /* 有中断未处理完 */
  712.         switch (IIR & 0x0e)
  713.         {
  714.             case 0x00:                                  /* Modem状态变化 中断    */
  715.                 break;
  716.             case 0x02:                                  /* THRE中断    */
  717.                 OSSemPost(Uart1Send);
  718.                 break;
  719.             case 0x04:                                  /* 接收数据可用 */
  720.                 OSSemPost(Uart1Get);
  721.                 U1IER &= (~0x01);                       /* 禁止接收及字符超时中断 */
  722.                 break;
  723.             case 0x06:                                  /* 接收线状态   */
  724.                 temp = U1LSR;
  725.                 break;
  726.             case 0x0c:                                  /* 字符超时指示 */
  727.                 OSSemPost(Uart1Get);
  728.                 U1IER &= (~0x01);                       /* 禁止接收及字符超时中断 */
  729.                 break;
  730.             default :
  731.                 break;
  732.         }
  733.     } 
  734.     VICVectAddr = 0;            // 通知中断控制器中断结束
  735.     OS_EXIT_CRITICAL();
  736. }
  737. /*********************************************************************************************************
  738. **                            End Of File
  739. ********************************************************************************************************/