📄 uartcom.lst
字号:
C51 COMPILER V9.02 UARTCOM 11/08/2012 21:34:06 PAGE 1
C51 COMPILER V9.02, COMPILATION OF MODULE UARTCOM
OBJECT MODULE PLACED IN ..\output\UartCom.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\source\UartCom.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(..\ou
-tput\UartCom.lst) OBJECT(..\output\UartCom.obj)
line level source
1 /*
2 **********************************************************************************************************
-***
3 * Kingst-51
4 * Development board samples
5 *
6 * (c) Copyright 2009-2012, Kingst Studio
7 * All Rights Reserved
8 *
9 * http://www.kingst.org
10 * 文件名:UartCom.c
11 * 描 述:串口通信驱动文件
12 * 版本号:1.0.0
13 * 备 注:本驱动提供可按数据块操作的串口写入和读取功能函数,
14 * 并按照设定的超时时间,自动判断是否接收完一帧数据,在接收完时设置状态标志
15 **********************************************************************************************************
-***
16 */
17
18 #define _UART_COM_C
19 #include "config.h"
20 #include "main.h"
21 #include "UartCom.h"
22
23
24 /*
25 ********************************************************************************
26 * ----------------------- Local defines ---------------------------------------
27 ********************************************************************************
28 */
29 /* 接收、发送缓冲区容量设置(最大不能超过126) */
30 #define RX_BUFF_SIZE 50
31 #define TX_BUFF_SIZE 30
32
33
34 /* 帧间隔设定,即超过此时间时认定为一帧数据传输结束 */
35 #define FRAME_SPACE_TIME 50 //单位ms
36
37
38 /*
39 ********************************************************************************
40 * ----------------------- Local variables -------------------------------------
41 ********************************************************************************
42 */
43 /* 通信状态控制 */
44 typedef struct {
45 int8 rxbtm;
46 int8 rxcnt;
47 int8 txbtm;
48 int8 txtop;
49 } sComSta;
50 static sComSta ComSta;
51 static uint8 xdata RxBuff[RX_BUFF_SIZE];
52 static uint8 xdata TxBuff[TX_BUFF_SIZE];
C51 COMPILER V9.02 UARTCOM 11/08/2012 21:34:06 PAGE 2
53
54
55 /*
56 ********************************************************************************
57 * ----------------------- Globle variables ------------------------------------
58 ********************************************************************************
59 */
60 eUartRxSta UartRxSta = RX_NONE; //串口接收状态
61
62
63 /*
64 ***************************************************************************************************
65 * ---------------------------------- Source codes ------------------------------------------------
66 ***************************************************************************************************
67 */
68
69 /*
70 * 函数名:UartComInit
71 * 描 述:初始化串口通信配置
72 */
73 void UartComInit(void)
74 {
75 1 /* 配置T1为波特率发生器 */
76 1 TMOD &= 0x0F;
77 1 TMOD |= 0x20;
78 1 TH1 = 244; //波特率2400,计算公式如下:
79 1 TL1 = 244; //256 - 时钟频率/(12*32*波特率)
80 1 ET1 = 0;
81 1
82 1 /* 配置串口工作模式 */
83 1 SCON = 0x50;
84 1 TR1 = 1;
85 1 ES = 1;
86 1 }
87
88
89 /*
90 * 函数名:UartWrite
91 * 描 述:UART发送函数,向缓冲区写入指定长度的数据,并启动发送
92 * 输 入:buff - 待写入数据块的指针
93 * len - 待写入数据块的长度
94 * 输 出:返回值 - 实际写入的数据长度
95 */
96 int8 UartWrite(const void *buff, int8 len)
97 {
98 1 int8 i, end;
99 1 const uint8 *src;
100 1
101 1 /* 获取实际可写入长度 */
102 1 EA = 0;
103 1 i = ComSta.txtop - ComSta.txbtm;
104 1 EA = 1;
105 1 if (i < 0) {
106 2 i += TX_BUFF_SIZE;
107 2 }
108 1 i = TX_BUFF_SIZE - i;
109 1 if (len > i) {
110 2 return 0;
111 2 }
112 1
113 1 /* 拷贝数据到缓冲区中 */
114 1 src = (const uint8 *)buff;
C51 COMPILER V9.02 UARTCOM 11/08/2012 21:34:06 PAGE 3
115 1 i = ComSta.txtop;
116 1 end = i + len;
117 1 if (end < TX_BUFF_SIZE) {
118 2 for (; i<end; i++) {
119 3 TxBuff[i] = *src++;
120 3 }
121 2 }
122 1 else {
123 2 for (; i<TX_BUFF_SIZE; i++) {
124 3 TxBuff[i] = *src++;
125 3 }
126 2 end -= TX_BUFF_SIZE;
127 2 for (i=0; i<end; i++) {
128 3 TxBuff[i] = *src++;
129 3 }
130 2 }
131 1
132 1 /* 修改缓冲区指向信息 */
133 1 EA = 0;
134 1 if (ComSta.txbtm == ComSta.txtop) {
135 2 TI = 1;
136 2 }
137 1 ComSta.txtop = end;
138 1 EA = 1;
139 1
140 1 return len;
141 1 }
142
143 /*
144 * 函数名:UartRead
145 * 描 述:UART接收缓冲区读取函数,读取指定长度的数据
146 * 输 出:在指针上输出数据,返回实际读到的数据长度,错误时返回-1
147 * 输 入:buff - 数据读取的接收指针
148 * len - 读取的数据块长度(-1为全部读出)
149 * 输 出:buff - 在此指针上输出读到的数据
150 * 返回值 - 实际读到的数据长度
151 */
152 int8 UartRead(void *buff, int8 len)
153 {
154 1 int8 i, end;
155 1 uint8 *dest;
156 1
157 1 /* 获取实际可读取长度 */
158 1 EA = 0;
159 1 if ((len>ComSta.rxcnt) || (len<0)) {
160 2 len = ComSta.rxcnt;
161 2 }
162 1 EA = 1;
163 1
164 1 /* 从缓冲区拷贝数据 */
165 1 dest = (uint8 *)buff;
166 1 i = ComSta.rxbtm;
167 1 end = i + len;
168 1 if (end < RX_BUFF_SIZE) {
169 2 for (; i<end; i++) {
170 3 *dest++ = RxBuff[i];
171 3 }
172 2 }
173 1 else {
174 2 for (; i<RX_BUFF_SIZE; i++) {
175 3 *dest++ = RxBuff[i];
176 3 }
C51 COMPILER V9.02 UARTCOM 11/08/2012 21:34:06 PAGE 4
177 2 end -= RX_BUFF_SIZE;
178 2 for (i=0; i<end; i++) {
179 3 *dest++ = RxBuff[i];
180 3 }
181 2 }
182 1
183 1 /* 修改缓冲区指向信息 */
184 1 EA = 0;
185 1 ComSta.rxbtm = end;
186 1 ComSta.rxcnt -= len;
187 1 EA = 1;
188 1
189 1 return len;
190 1 }
191
192 /*
193 * 函数名:UartRxMonitor
194 * 描 述:UART通信接收的监控函数,用于判定一帧数据的接收完成
195 * 输 入:ms - 本函数调用的间隔时间,单位ms
196 * 输 出:无
197 */
198 void UartRxMonitor(uint8 ms)
199 {
200 1 uint8 cnt;
201 1 static uint8 cntbkp;
202 1 static uint8 idletmr;
203 1 static uint8 sigpost;
204 1
205 1 cnt = ComSta.rxcnt;
206 1 if (cnt == 0) {
207 2 cntbkp = 0;
208 2 return;
209 2 }
210 1 if (cnt != cntbkp) {
211 2 idletmr = 0;
212 2 sigpost = 0;
213 2 cntbkp = cnt;
214 2 return;
215 2 }
216 1 if (sigpost != 0) { //保证接收完成标志只推送一次
217 2 return;
218 2 }
219 1 idletmr += ms;
220 1 if (idletmr >= FRAME_SPACE_TIME) {
221 2 sigpost = 1;
222 2 UartRxSta = RX_FINISH;
223 2 }
224 1 }
225
226 /*
227 * 函数名:Serial_ISR
228 * 描 述:串口中断服务函数
229 */
230 void Serial_ISR() interrupt 4
231 {
232 1 uint8 chr;
233 1 int8 top;
234 1
235 1 /* 接收字符,保存到接收缓冲区中 */
236 1 if (RI == 1) {
237 2 RI = 0;
238 2 chr = SBUF;
C51 COMPILER V9.02 UARTCOM 11/08/2012 21:34:06 PAGE 5
239 2 if (ComSta.rxcnt < RX_BUFF_SIZE) {
240 3 top = ComSta.rxbtm + ComSta.rxcnt;
241 3 if (top >= RX_BUFF_SIZE) {
242 4 top -= RX_BUFF_SIZE;
243 4 }
244 3 RxBuff[top] = chr;
245 3 ComSta.rxcnt++;
246 3 }
247 2 }
248 1
249 1 /* 由发送缓冲区中提取字符,并发送 */
250 1 if (TI == 1) {
251 2 TI = 0;
252 2 if (ComSta.txbtm != ComSta.txtop) {
253 3 SBUF = TxBuff[ComSta.txbtm];
254 3 ComSta.txbtm++;
255 3 if (ComSta.txbtm >= TX_BUFF_SIZE) {
256 4 ComSta.txbtm = 0;
257 4 }
258 3 }
259 2 }
260 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 657 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 80 ----
PDATA SIZE = ---- ----
DATA SIZE = 8 9
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -