chars.c
上传用户:sdttscl
上传日期:2010-01-04
资源大小:683k
文件大小:6k
源码类别:

Modem编程

开发平台:

C/C++

  1. //---------------------------------------------------------------------------------------------------
  2. // Project:- DE8681
  3. //   Filename:- CHARS.C
  4. // Description:- Tx and Rx Character processing routines
  5. // Programmer:- D.T.F
  6. // Version:- 2.0
  7. // Created:- 28th November 2002
  8. // Last modified:-
  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. tmprx = sci_getByte(); // Read SCI receive register
  34. // Ignore all chars if the last AT command is still being processed
  35. // Exit if frame or overrun errors are experienced
  36. if (sci_checkOERR() || INTERPRET) return;
  37. // Set abort flag if key pushed during BERT or Test Functions
  38. if (BERTFLAG || TESTFUNC1 || TESTFUNC2)
  39. {
  40. KEYABORT = 1; // Set flag to indicate abort
  41. return;
  42. }
  43. // Set abort flag if key pushed during handshaking
  44. if (!ATCMDMODE && !DATAXFER) // During Handshaking
  45. {
  46. KEYABORT = 1; // Set flag to indicate abort
  47. return;
  48. }
  49. // Ignore chars outside the AT Command character set (echo all chars if required)
  50. if ((tmprx <= '9' && tmprx >= '0') || (tmprx <= 'Z' && tmprx >= 'A')
  51. || (tmprx <= 'z' && tmprx >= 'a') || tmprx == S3 || tmprx == S5
  52. || tmprx == '&' || tmprx == '@' || tmprx == '='
  53. || tmprx == '?' || tmprx == ',' || tmprx == '%' || tmprx == '*'
  54. || tmprx == '#' || tmprx == '/')
  55. {
  56. if (ATCHAR)
  57. {
  58. if (tmprx == S3)
  59. {
  60. ATBUF[ATBUFPTR] = NUL; // Null terminate command buffer string 
  61. REPCMD=1; // Set repeat command flag
  62. ATCHAR=0; // Clear 'AT' char flag
  63. ACHAR=0; // Clear 'A' char flag
  64. INTERPRET=1; // Set Interpret flag
  65. CTSN=1; // Prevent any further chars
  66. }
  67. else if (tmprx == S5)
  68. {
  69. if (ATBUFPTR != 0) ATBUFPTR--; // Decrement AT Command Buffer Pointer
  70. }
  71. else
  72. {
  73. if (ATBUFPTR == 47) // If command buffer is full
  74. {
  75. ATBUF[ATBUFPTR] = NUL; // Null terminate command buffer string 
  76. REPCMD=1; // Set repeat command flag
  77. ATCHAR=0; // Clear 'AT' char flag
  78. ACHAR=0; // Clear 'A' char flag
  79. INTERPRET=1; // Set Interpret flag
  80. CTSN=1; // Prevent any further chars
  81. }
  82. else
  83. {
  84. ATBUF[ATBUFPTR++] = tmprx; // Load current char into command buffer
  85. // Increment AT Command Buffer Pointer
  86. }
  87. }
  88. }
  89. else if (ACHAR)
  90. {
  91. if (tmprx == '/')
  92. {
  93. ACHAR=0; // Clear 'A' char flag
  94. INTERPRET=1; // Set Interpret flag
  95. CTSN=1; // Prevent any further chars
  96. }
  97. // If the current char is 'T' or 't' then set 'AT' char flag
  98. if (tmprx == 'T' || tmprx == 't') ATCHAR=1;
  99. }
  100. else
  101. {
  102. if (tmprx == 'A' || tmprx == 'a') ACHAR=1; // Set 'A' char flag
  103. }
  104. }
  105. if (ECHO) // Echo current rx char if required
  106. {
  107. MSGBUF[MSGBUFLDPTR++]=tmprx;
  108. MSGBUFLDPTR &= msgbufwrap; // Wrap round buffer if necessary
  109. if ((tmprx == S3) && WORDRES) // Check for CR char and word result enabled
  110. {
  111. MSGBUF[MSGBUFLDPTR++]= S4; // Insert additional LF
  112. MSGBUFLDPTR &= msgbufwrap; // Wrap round buffer if necessary
  113. }
  114. LOADCHAR=1; // Set load char flag
  115. }
  116. }
  117. void tx_chars(void)
  118. {
  119. if (TXIF)
  120. {
  121. if (!RTSN)
  122. {
  123. if (MSGBUFRDPTR != MSGBUFLDPTR)
  124. {
  125. TXREG = MSGBUF[MSGBUFRDPTR++];
  126. MSGBUFRDPTR &= msgbufwrap; // Wrap round buffer if necessary
  127. }
  128. else
  129. {
  130. TXIE=0; // Disable Tx interrupt
  131. }
  132. }
  133. }
  134. }
  135. void rx_datachars(void)
  136. {
  137. unsigned char tmprx;
  138. if (sci_getFERR())
  139. {
  140. sci_getByte(); // Read SCI receive register
  141. return; // Return
  142. }
  143. tmprx = sci_getByte(); // Read SCI receive register
  144. // Exit if frame or overrun errors are experienced
  145. if (sci_checkOERR()) return;
  146. DATABUF[DATABUFLDPTR++]=tmprx; // Load Data buffer at buffer location
  147. DATABUFLDPTR &= databufwrap; // Wrap round buffer if necessary
  148. if (((DATABUFLDPTR - DATABUFRDPTR) & databufwrap) >= databufpause)
  149. {
  150. CTSN=1; // Prevent any further chars
  151. }
  152. if (ESCTMR == 0) // If the Escape Timer has expired set the Flag
  153. {
  154. ESCTMREXP = 1;
  155. }
  156. ESCTMR = S12; // Reload the Escape Timer
  157. if (tmprx != S2)
  158. {
  159. ESCTMREXP = 0; // Clear Escape Timer Expired Flag
  160. ESC1CHAR = 0; // Clear 1st Escape Character Match Flag
  161. ESC2CHAR = 0; // Clear 2nd Escape Character Match Flag
  162. return;
  163. }
  164. if (!ESCTMREXP) return;
  165. if (!ESC1CHAR)
  166. {
  167. ESC1CHAR = 1; // Set 1st Escape Character Match Flag
  168. return;
  169. }
  170. if (!ESC2CHAR)
  171. {
  172. ESC2CHAR = 1; // Set 2nd Escape Character Match Flag
  173. return;
  174. }
  175. ATCMDMODE = 1; // Escape sequence received so revert back to AT command mode
  176.  
  177. DATABUFLDPTR = 0x00; // Initialise Data Buffer Load pointer
  178. DATABUFRDPTR = 0x00; // Initialise Data Buffer Read pointer
  179. ESCTMREXP = 0; // Clear Escape Timer Expired Flag
  180. ESC1CHAR = 0; // Clear 1st Escape Character Match Flag
  181. ESC2CHAR = 0; // Clear 2nd Escape Character Match Flag
  182. CTSN=0; // Ensure we can accept new characters
  183. }