📄 comm.lst
字号:
C51 COMPILER V7.00 COMM 09/22/2005 17:15:32 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE COMM
OBJECT MODULE PLACED IN .\out\comm.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE comm.c LARGE BROWSE DEBUG OBJECTEXTEND OBJECT(.\out\comm.obj)
stmt level source
1 #define COMM_FILE
2 #include "include.h"
3
4 //uchar data time;
5 //uint data r_in=0,r_out=0,t_in=0,t_out=0; /*队列指针*/
6 //bit r_full=0,t_empty=0,t_done=0;
7 /*0=接收缓冲区空,1=满;
8 0=发送缓冲区空,1=正在发送
9 1=正在发送最后字节;
10 */
11
12 //uchar xdata t_buf[1024]; /* 串行发送缓冲 */
13 //uchar xdata r_buf[1024]; /* 串行接收缓冲 */
14
15 /*-----------------------------------------------------
16 ; 串口数据块发送程序
17 ; 入口参数: buffer == 数据缓冲区指针
18 ; length == 数据的长度
19 ; 出口参数: 无
20 -----------------------------------------------------*/
21 void send_str(uint length,uchar *buffer)
22 {
23 1 do{
24 2 if((((t_in+1)^t_out)&0x3ff)!=0) /*t_in+1=t_out 测试缓冲区满*/
25 2 {
26 3 t_buf[t_in]=*buffer;
27 3 buffer++;
28 3 t_in=++t_in&0x3ff;
29 3 length--;
30 3 while(t_done); //如果正在发送最后字节则等待发送完成
31 3 if(!t_empty)
32 3 {
33 4 t_empty=1;
34 4 TI=1; //启动新一轮发送
35 4 }
36 3 }
37 2 }while(length);
38 1 }
39
40 /*-----------------------------------------------------
41 ; 串口字符发送程序
42 ; 入口参数: ch == 欲发送的字符串
43 ; 出口参数: 无
44 -----------------------------------------------------*/
45 //void send_char(uchar ch)
46 //{
47 // while(1)
48 // {
49 // if((((t_in+1)^t_out)&0x3ff)!=0) /*测试缓冲区满*/
50 // {
51 // t_buf[t_in]=ch;
52 // t_in=++t_in&0x3ff;
53 // while(t_done); //如果正在发送最后字节则等待发送完成
54 // if(!t_empty)
55 // {
C51 COMPILER V7.00 COMM 09/22/2005 17:15:32 PAGE 2
56 // t_empty=1;
57 // TI=1; //启动新一轮发送
58 // }
59 // return;
60 // }
61 // }
62 //}
63
64 /*--------------------------------------------------------------
65 等待发送结束
66 出口参数:
67 == 0 正确
68 == 1 超时
69 --------------------------------------------------------------*/
70 uchar wait_send_end(void)
71 {
72 1 uchar i;
73 1 i = 5;
74 1 time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
75 1 do
76 1 {
77 2 if(!t_empty) {return(0);}
78 2 if(!time)
79 2 {
80 3 time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
81 3 i--;
82 3 }
83 2 }while(i);
84 1 return(1);
85 1 }
86
87 /*-----------------------------------------------------
88 ; 串口接收程序
89 ; 入口参数: buffer == 数据缓冲区指针
90 ; length == 数据的长度
91 ; 出口参数: == 0 正确
92 ; != 0 超时(TIMEO)
93 -----------------------------------------------------*/
94 uchar rece(uint length,uchar *buffer)
95 {
96 1 uchar rece_one; /*==1,已接收了一个字节*/
97 1 uint len;
98 1
99 1 rece_one = 0;
100 1 len=0;
101 1 time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
102 1 while(time)
103 1 {
104 2 if(r_out!=r_in) /*缓冲区非空*/
105 2 {
106 3 buffer[len]=r_buf[r_out];
107 3 length--;
108 3 r_out=++r_out&0x3ff;
109 3 if(length==0) return(0);
110 3 time=200; /*字符间隔时间为1秒*/
111 3 len++;
112 3 }
113 2 }
114 1 if(len) return(0xd3);
115 1 else return(0xd4);
116 1 }
117
C51 COMPILER V7.00 COMM 09/22/2005 17:15:32 PAGE 3
118 /*-----------------------------------------------------
119 清除串口缓冲区
120 -----------------------------------------------------*/
121 void clear_rece_buffer(void)
122 {
123 1 r_out=r_in;
124 1 r_full=0;
125 1 }
126
127 /*-----------------------------------------------------
128 ; 串口接收一行程序
129 ; 入口参数: buffer == 数据缓冲区指针
130 ; 出口参数: == 0 正确
131 ; != 0 超时(TIMEO)
132 -----------------------------------------------------*/
133
134 //uchar receline(uchar *buffer)
135 //{
136 // uchar *buf;
137 // buf=buffer;
138 // time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
139 // while(time)
140 // {
141 // if(r_out!=r_in) /*缓冲区非空*/
142 // {
143 // *buffer = r_buf[r_out];
144 // r_out=++r_out&0x3ff;
145 // time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
146 // if(*buffer == 0x0a) return 0;
147 // buffer++;
148 // }
149 // }
150 // if(buf!=buffer) return 0xd3;
151 // else return 0xd4;
152 //}
153
154 /*-----------------------------------------------------
155 ; 串口接收1byte程序
156 ; 入口参数: buffer == 数据缓冲区指针
157 ; 出口参数: == 0 没有数据
158 ; == 1 返回1Byte,还有接收数据没有被读取
159 ; == 3 返回1Byte,没有剩余数据
160 -----------------------------------------------------*/
161
162 uchar rece_s(uchar *buffer)
163 {
164 1 if(r_out!=r_in) /*缓冲区非空*/
165 1 {
166 2 *buffer=r_buf[r_out];
167 2 r_out=++r_out&0x3ff;
168 2 if(r_out!=r_in) return 1;
169 2 return 3;
170 2 }
171 1 return 0;
172 1 }
173
174 /***********************************************************************************
175 接收命令包
176 ***********************************************************************************/
177 uchar rece_cmd(uchar *cmd,uchar *package,uint *len,uchar *para)
178 {
179 1 uchar error,error1,buf[10],xor;
C51 COMPILER V7.00 COMM 09/22/2005 17:15:32 PAGE 4
180 1 uint temp,i;
181 1
182 1 error=rece(2,buf);
183 1 #ifdef ZLH_DEBUG
184 1 // disp_data(2,"A4");
185 1 // disp_data(1,&error);
186 1 // disp_data(2,buf);
187 1 #endif
188 1 if(error){
189 2 if((error==0xd3)&&(buf[0]==0x1b)){
190 3 error1=rece_s(&buf[1]);
191 3 if(error1&&(buf[1]==0x10)) goto RECE_DATA;
192 3 }
193 2 return OVER_TIME;
194 2 }
195 1 if(buf[1]==0x1b){
196 2 error1=rece_s(&buf[2]);
197 2 if(error1&&(buf[2]==0x10)) goto RECE_DATA;
198 2 else return OVER_TIME;
199 2 }
200 1 if((buf[0]!=0x1b)||(buf[1]!=0x10)) return OVER_TIME;
201 1
202 1 RECE_DATA:
203 1 buf[0]=0x1b;buf[1]=0x10;
204 1 error=rece(4,&buf[2]);
205 1 if(error) return CMD_HEAD_ERR;
206 1
207 1 *cmd=buf[2];
208 1 *package=buf[3];
209 1 temp=*((uint *)&buf[4]);
210 1 temp=temp-6+1;
211 1
212 1 error=rece(temp,para);
213 1 if(error) return RECE_DATA_ERR;
214 1
215 1 xor=buf[0];
216 1 for(i=1;i<6;i++)
217 1 xor^=buf[i];
218 1 for(i=0;i<temp-1;i++)
219 1 xor^=para[i];
220 1
221 1 #ifdef ZLH_DEBUG
222 1 // disp_data(2,"A4");
223 1 // disp_data(1,&xor);
224 1 // disp_data(1,¶[temp-1]);
225 1 #endif
226 1 // if(xor==para[temp-1])
227 1 // {
228 1 *len=temp-1;
229 1 return 0;
230 1 // }
231 1 // else return XOR_ERR;
232 1 }
233
234 /****************************************************************************************
235 发送应答数据包
236 ****************************************************************************************/
237 uchar send_data(uchar package,uint len,uchar *para)
238 {
239 1 uchar buf[20],xor,j,error;
240 1 uint i,temp;
241 1
C51 COMPILER V7.00 COMM 09/22/2005 17:15:32 PAGE 5
242 1 buf[0]='O';buf[1]='K';
243 1 buf[2]=package;
244 1 temp=len+5;
245 1 buf[3]=(uchar)(temp>>8);
246 1 buf[4]=(uchar)temp;
247 1
248 1 xor=buf[0];
249 1 for(i=1;i<5;i++)
250 1 xor^=buf[i];
251 1 if(len){
252 2 for(i=0;i<len;i++)
253 2 xor^=para[i];
254 2 }
255 1 for(i=0;i<3;i++){
256 2 send_str(5,buf);
257 2 if(len) send_str(len,para);
258 2 send_str(1,&xor);
259 2 clear_rece_buffer();
260 2 if(package){
261 3 wait_send_end();
262 3 for(j=0;j<10;j++){
263 4 error=rece(1,&buf[10]);
264 4 if((!error)&&((buf[10]==0x32)||(buf[10]==0x33)))
265 4 break;
266 4 }
267 3 if(j==10) continue;
268 3 if(buf[10]==0x32) return 0;
269 3 }else{
270 3 return 0;
271 3 }
272 2 }
273 1 return COMM_ERR;
274 1 }
275
276 /*****************************************************************************************
277 发送出错应答
278 *****************************************************************************************/
279 void send_error(uchar error)
280 {
281 1 uchar buf[20];
282 1 uchar i;
283 1
284 1 buf[0]='E';
285 1 buf[1]='R';
286 1 buf[2]=0;
287 1 buf[3]=0;buf[4]=6;
288 1 buf[5]=error;
289 1 buf[6]=buf[0];
290 1 for(i=1;i<6;i++)
291 1 buf[6]^=buf[i];
292 1 send_str(7,buf);
293 1 }
294
295
296
297
298
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1150 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V7.00 COMM 09/22/2005 17:15:32 PAGE 6
XDATA SIZE = 2048 83
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -