📄 uart.lst
字号:
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN Uart.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Uart.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 ///////////////////////////////////////////////////////////////////////////////
2 // 门禁终端与上位服务器通信
3 // 门禁终端与上位服务器通信采用RS485总线方式连接,每台门禁终端分配固定设备
4 // 地址。
5 // 需要注意的是在处理串行通信的时候,可以关闭其它中断
6 // idata=19
7 ///////////////////////////////////////////////////////////////////////////////
8
9 #include "Global.h"
10
11
12 ///////////////////////////////////////////////////////////////////////////////
13 // 内部存储区变量 0~128字节
14 extern data uchar cur_time[15]; // 系统当前时间显示存储区 XXXX年XX月XX日XX时XX分XX秒星期X
15
16 extern data uchar pulse; // 蜂鸣
17 extern data uint time_out; // 通用超时定时器
18
19 extern data uint recv_ctr; // 接收数据起始指针
20 extern data uint trans_time; // 发送数据超时保护
21 extern data uint trans_ctr; // 发送数据指针
22 extern data uint trans_size; // 发送数据大小
23
24 extern idata uint SOH_crt; // 数据包开始指针
25
26 extern idata char wieformat; // 韦根通信格式
27
28 extern bdata bit maxtrans; // 大/小数据量传输状态
29 extern idata uchar baudrate; // 波特率
30 extern bdata bit comm_ok; // 通信状态
31 extern idata uchar laddr; // 地址低字节ASC码
32 extern idata uchar haddr; // 地址高字节ASC码
33 extern idata uchar currecno; // 当前已读取的实时记录索引
34 extern idata uchar sumrecno; // 所有实时记录索引
35
36 extern data uchar checksum; // 校验和
37 extern data uchar testchecksum; // 接收到的校验和
38
39 ///////////////////////////////////////////////////////////////////////////////
40 // 外部存储区变量 256~1280字节
41 extern xdata uchar SPIbuf[BUFSIZE]; // SPI和串行通信缓冲区
42 extern xdata uchar recv_buf[RCVBUFSIZE]; // 接收数据缓冲区
43 extern xdata uchar trans_buf[TRANSBUFSIZE]; // 发送数据缓冲区
44 extern xdata uchar RTrecord[MAX_REALREC_SIZE]; // 实时记录缓冲区
45
46 void sendmessage(uchar message); // 发送信息
47 void ClearRcvBuf(); // 清接收缓冲区
48
49 ///////////////////////////////////////////////////////////////////////////////
50 // 中断4服务列程
51 // 串行中断服务
52 ///////////////////////////////////////////////////////////////////////////////
53 void ser() interrupt 4
54 {
55 1 idata uchar c;
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 2
56 1
57 1 if(_testbit_(TI)) // 检测发送完成位
58 1 {
59 2 if(maxtrans) // 大数据量传输
60 2 {
61 3 trans_ctr++; // 发送指针下移
62 3 if(trans_ctr<trans_size)
63 3 SBUF=SPIbuf[trans_ctr]; // 发送数据
64 3 else
65 3 {
66 4 trans_ctr=0;
67 4 trans_size=0;
68 4 Dir=0; // 停止发送
69 4 }
70 3 }
71 2 else // 小数据量传输
72 2 {
73 3 trans_ctr++; // 发送指针下移
74 3 if(trans_ctr<trans_size)
75 3 SBUF=trans_buf[trans_ctr]; // 发送数据
76 3 else
77 3 {
78 4 trans_ctr=0;
79 4 trans_size=0;
80 4 Dir=0; // 停止发送
81 4 }
82 3 }
83 2 }
84 1
85 1 if(_testbit_(RI)) // 检测接收完成位
86 1 {
87 2 c=SBUF;
88 2 if(c!=0x00)
89 2 {
90 3 if(maxtrans) // 大数据量传输
91 3 {
92 4 SPIbuf[recv_ctr]=c;
93 4 recv_ctr++;
94 4 if(recv_ctr>BUFSIZE)
95 4 recv_ctr=0;
96 4 }
97 3 else // 小数据量传输
98 3 {
99 4 recv_buf[recv_ctr]=c;
100 4 recv_ctr++;
101 4 if(recv_ctr>RCVBUFSIZE)
102 4 recv_ctr=0;
103 4 }
104 3 }
105 2 }
106 1 }
107
108 ///////////////////////////////////////////////////////////////////////////////
109 // 检查接收缓冲区是否有完整的数据包
110 // 如果有返回成功,如果数据包不完整可能数据有部分丢失或者没有完整的数据返回失败
111 // 检查SOH和EOT来判断
112 ///////////////////////////////////////////////////////////////////////////////
113 bit checkmessage()
114 {
115 1 bdata bit SOHfound;
116 1 bdata bit EOTfound;
117 1 idata uchar temp;
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 3
118 1 idata uint i;
119 1
120 1 SOHfound=FALSE;
121 1 EOTfound=FALSE;
122 1
123 1 if(recv_ctr==0)
124 1 return FALSE; // 缓冲区中无数据
125 1
126 1 if(maxtrans)
127 1 {
128 2 if(recv_ctr>BUFSIZE) // 接收缓冲区溢出
129 2 {
130 3 ClearRcvBuf();
131 3 return FALSE;
132 3 }
133 2 }
134 1 else
135 1 {
136 2 if(recv_ctr>RCVBUFSIZE) // 接收缓冲区溢出
137 2 {
138 3 ClearRcvBuf();
139 3 return FALSE;
140 3 }
141 2 }
142 1
143 1 for(i=0; i<recv_ctr; i++)
144 1 {
145 2 if(maxtrans)
146 2 temp=SPIbuf[i];
147 2 else
148 2 temp=recv_buf[i];
149 2
150 2 if(temp==SOH)
151 2 {
152 3 SOHfound=TRUE; // 发现SOH
153 3 SOH_crt=i;
154 3 }
155 2 if(temp==EOT)
156 2 EOTfound=TRUE; // 发现 EOT
157 2 }
158 1
159 1 if(SOHfound&&EOTfound)
160 1 {
161 2 COMDISABLE; // 不允许再接收数据
162 2 return TRUE; // 接收到完整的数据包
163 2 }
164 1
165 1 return FALSE;
166 1 }
167
168 ///////////////////////////////////////////////////////////////////////////////
169 // 发送信息
170 ///////////////////////////////////////////////////////////////////////////////
171 void sendmessage(uchar message)
172 {
173 1 idata uchar i;
174 1 idata uchar temp;
175 1
176 1 if(maxtrans) // 大模式数据传输
177 1 {
178 2 SPIbuf[0]=SOH;
179 2 SPIbuf[1]=haddr; // 源地址
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 4
180 2 SPIbuf[2]=laddr;
181 2 SPIbuf[3]='0'; // 目标地址
182 2 SPIbuf[4]='0';
183 2 SPIbuf[5]='0'; // 信息号
184 2 SPIbuf[6]=message; // ACK/NAK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -