chars.c
上传用户:lilishw
上传日期:2021-05-28
资源大小:1542k
文件大小:7k
源码类别:

Modem编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------------------------------
  2. //  Project:-   DE8681
  3. //  Filename:-  CHARS.C
  4. //  Description:-   Tx and Rx Character processing routines
  5. //  Programmer:-    D.T.F   
  6. //  Version:-   3.0
  7. //  Created:-   28th November 2002
  8. //  Last modified:- 1/12/2003 (M.T)
  9. //---------------------------------------------------------------------------------------------------
  10. //  (C) Consumer Microcircuits Ltd 2002
  11. //
  12. //  This firmware was designed by:-
  13. //          Consumer Microcircuits Ltd,
  14. //          Langford, Maldon,
  15. //          ESSEX
  16. //          CM9 6WG.
  17. //  in the UK for use with CML evaluation kits only and is based on UK originated technology.
  18. //  Please contact
  19. //          sales@cmlmicro.co.uk
  20. //          +44 (0)1621 875500
  21. //  for licensing details.
  22. //---------------------------------------------------------------------------------------------------
  23. #define CHARS_C
  24. #include    "ef8681.h"
  25. void rx_atchars(void)
  26. {
  27.     unsigned char tmprx;
  28.     if (sci_getFERR())
  29.     {
  30.         sci_getByte();      // Read SCI receive register
  31.         return;             // Return
  32.     }
  33.         
  34.     tmprx = sci_getByte();          // Read SCI receive register
  35.     // Ignore all chars if the last AT command is still being processed
  36.     // Exit if frame or overrun errors are experienced
  37.     if (sci_checkOERR() || INTERPRET) return;
  38.     // Set abort flag if key pushed during BERT or Test Functions
  39.     if (BERTFLAG || TESTFUNC1)
  40.     {
  41.         KEYABORT = 1;       // Set flag to indicate abort
  42.         return;
  43.     }
  44.     
  45.     if (ECHO)               // Echo current rx char if required
  46.     {
  47.         MSGBUF[MSGBUFLDPTR++]=tmprx;
  48.         MSGBUFLDPTR &= msgbufwrap;  // Wrap round buffer if necessary
  49.         if ((tmprx == S3) && WORDRES)       // Check for CR char and word result enabled
  50.         {
  51.             MSGBUF[MSGBUFLDPTR++]= S4;  // Insert additional LF
  52.             MSGBUFLDPTR &= msgbufwrap;  // Wrap round buffer if necessary
  53.         }
  54.         LOADCHAR=1;         // Set load char flag
  55.     }
  56.     // If in DTMF transmit mode pass character to testfunc2() by placing it in ATBUF[0]
  57.     // needs to be here to allow char. echoing
  58.     if(TESTFUNC2)
  59.     {
  60.         ATBUF[0] = tmprx;   
  61.         ACHAR = 1;
  62.         return;
  63.     }
  64.     // Set abort flag if key pushed during handshaking
  65.     if (!ATCMDMODE && !DATAXFER)    // During Handshaking
  66.     {
  67.         KEYABORT = 1;       // Set flag to indicate abort
  68.         return;
  69.     }
  70.     // Ignore chars outside the AT Command character set (echo all chars if required)
  71.     if ((tmprx <= '9' && tmprx >= '0') || (tmprx <= 'Z' && tmprx >= 'A')
  72.         || (tmprx <= 'z' && tmprx >= 'a') || tmprx == S3 || tmprx == S5
  73.         || tmprx == '&' || tmprx == '@' || tmprx == '='
  74.         || tmprx == '?' || tmprx == ',' || tmprx == '%' || tmprx == '*'
  75.         || tmprx == '#' || tmprx == '/')
  76.     {
  77.         if (ATCHAR)
  78.         {   
  79.             if (tmprx == S3)
  80.             {
  81.                 ATBUF[ATBUFPTR] = NUL;  // Null terminate command buffer string 
  82.                 REPCMD=1;       // Set repeat command flag
  83.                 ATCHAR=0;       // Clear 'AT' char flag
  84.                 ACHAR=0;        // Clear 'A' char flag
  85.                 INTERPRET=1;    // Set Interpret flag
  86.                 CTSN=1;         // Prevent any further chars
  87.             }
  88.             else if (tmprx == S5)
  89.             {
  90.                 if (ATBUFPTR != 0) ATBUFPTR--;  // Decrement AT Command Buffer Pointer
  91.             }
  92.             else
  93.             {
  94.                 if (ATBUFPTR == 47) // If command buffer is full
  95.                 {
  96.                     ATBUF[ATBUFPTR] = NUL;  // Null terminate command buffer string 
  97.                     REPCMD=1;       // Set repeat command flag
  98.                     ATCHAR=0;       // Clear 'AT' char flag
  99.                     ACHAR=0;        // Clear 'A' char flag
  100.                     INTERPRET=1;    // Set Interpret flag
  101.                     CTSN=1;         // Prevent any further chars
  102.                 }
  103.                 else
  104.                 {
  105.                     ATBUF[ATBUFPTR++] = tmprx;  // Load current char into command buffer
  106.                                     // Increment AT Command Buffer Pointer
  107.                 }
  108.             }
  109.         }
  110.         else if (ACHAR)
  111.         {
  112.             if (tmprx == '/')
  113.             {
  114.                 ACHAR=0;        // Clear 'A' char flag
  115.                 INTERPRET=1;    // Set Interpret flag
  116.                 CTSN=1;         // Prevent any further chars
  117.             }
  118.             // If the current char is 'T' or 't' then set 'AT' char flag
  119.             if (tmprx == 'T' || tmprx == 't') ATCHAR=1;
  120.         }
  121.         else
  122.         {
  123.             if (tmprx == 'A' || tmprx == 'a') ACHAR=1;  // Set 'A' char flag
  124.         }
  125.     }           
  126. }
  127. void tx_chars(void)
  128. {
  129.     if (TXIF)
  130.     {
  131.         if (!RTSN)
  132.         {
  133.             if (MSGBUFRDPTR != MSGBUFLDPTR)
  134.             {
  135.                 TXREG = MSGBUF[MSGBUFRDPTR++];
  136.                 MSGBUFRDPTR &= msgbufwrap;  // Wrap round buffer if necessary
  137.             }
  138.             else
  139.             {
  140.                 TXIE=0;         // Disable Tx interrupt
  141.             }
  142.         }
  143.     }   
  144. }
  145. void rx_datachars(void)
  146. {
  147.     unsigned char tmprx;
  148.     if (sci_getFERR())
  149.     {
  150.         sci_getByte();              // Read SCI receive register
  151.         return;                     // Return
  152.     }
  153.         
  154.     tmprx = sci_getByte();          // Read SCI receive register
  155.     // Exit if frame or overrun errors are experienced
  156.     if (sci_checkOERR()) return;
  157.     DATABUF[DATABUFLDPTR++]=tmprx;  // Load Data buffer at buffer location
  158.     DATABUFLDPTR &= databufwrap;    // Wrap round buffer if necessary
  159.     if (((DATABUFLDPTR - DATABUFRDPTR) & databufwrap) >= databufpause)
  160.     {
  161.         CTSN=1;                     // Prevent any further chars
  162.     }
  163.     if (ESCTMR == 0)                // If the Escape Timer has expired set the Flag
  164.     {
  165.         ESCTMREXP = 1;
  166.     }
  167.     ESCTMR = S12;                   // Reload the Escape Timer
  168.     if (tmprx != S2)
  169.     {
  170.         ESCTMREXP = 0;                  // Clear Escape Timer Expired Flag
  171.         ESC1CHAR = 0;                   // Clear 1st Escape Character Match Flag
  172.         ESC2CHAR = 0;                   // Clear 2nd Escape Character Match Flag
  173.         return;
  174.     }
  175.     if (!ESCTMREXP) return;
  176.     if (!ESC1CHAR)
  177.     {
  178.         ESC1CHAR = 1;                   // Set 1st Escape Character Match Flag
  179.         return;
  180.     }
  181.     if (!ESC2CHAR)
  182.     {
  183.         ESC2CHAR = 1;                   // Set 2nd Escape Character Match Flag
  184.         return;
  185.     }
  186.     
  187.     ATCMDMODE = 1;                      // Escape sequence received so revert back to AT command mode
  188.      
  189.     DATABUFLDPTR = 0x00;                // Initialise Data Buffer Load pointer
  190.     DATABUFRDPTR = 0x00;                // Initialise Data Buffer Read pointer
  191.     ESCTMREXP = 0;                      // Clear Escape Timer Expired Flag
  192.     ESC1CHAR = 0;                       // Clear 1st Escape Character Match Flag
  193.     ESC2CHAR = 0;                       // Clear 2nd Escape Character Match Flag
  194.     CTSN=0;                             // Ensure we can accept new characters
  195. }