📄 download.lst
字号:
182 1 //初始化串口接收结构体
183 1 InitRec();
184 1
185 1 //通讯状态
186 1 CommOk=FALSE;
187 1
188 1 while(1)
189 1 {
190 2 //命令接收完毕
191 2 if(Rec.Finish)
192 2 {
193 3 //验证命令合法性
194 3 if(!VerifyCmdStr(&Cmd,&DataLen))
195 3 {
196 4 Cmd=0x0f;
197 4 SendCmdStr(&Cmd,1);
198 4 goto restart;
199 4 }
200 3
201 3 //通讯状态
202 3 CommOk=FALSE;
203 3
204 3 //解析命令
205 3 switch(Cmd)
206 3 {
207 4 case 0x5a: //握手通讯
208 4
209 4 //返回握手成功的命令
210 4 SendCmdStr(&Cmd,1);
211 4 CommOk=TRUE;
212 4 break;
213 4
214 4 case 0x04: //发送文件页数
215 4
216 4 //文件页数
217 4 File.Pages=Rec.Buffer[7]*256+Rec.Buffer[8];
218 4
219 4 SendCmdStr(&Cmd,1);
220 4 CommOk=TRUE;
221 4 break;
222 4
223 4 case 0x05: //发送起始地址
224 4
225 4 //写入的起始地址
226 4 File.Addr=Rec.Buffer[7]*256+Rec.Buffer[8];
227 4
228 4 //返回OK
229 4 SendCmdStr(&Cmd,1);
230 4
231 4 CommOk=TRUE;
232 4
233 4 break;
234 4
235 4 case 0x06: //下载文件数据
236 4
237 4 //本次接收的数据长度, 6是 LH,LL,/LH,/LL,CMD,CS的长度
238 4 TempLen = Rec.Buffer[2]*256+Rec.Buffer[3]-6;
239 4
240 4 //暂存数据
241 4 memcpy(Rec.Data+Rec.DataLen,Rec.Buffer+7,TempLen);
C51 COMPILER V7.10 DOWNLOAD 03/30/2007 17:02:48 PAGE 5
242 4
243 4 //长度增加
244 4 Rec.DataLen+=TempLen;
245 4
246 4 //达到256字节
247 4 if(Rec.DataLen>=PAGE_SIZE)
248 4 {
249 5 /* //测试文件接收256字节后自动向PC发送256字节
250 5 SerialPort_send(0xdd);
251 5 SerialPort_send(0xdd);
252 5 SerialPort_send(0xdd);
253 5 SerialPort_send(0xdd);
254 5 for(i=0;i<Rec.DataLen;i++)
255 5 {
256 5 SerialPort_send(Rec.Data[i]);
257 5 }
258 5
259 5 i=0;
260 5
261 5 if(i==0) while(1);
262 5 */
263 5
264 5 //写到W29C040存储器
265 5 if(!WritePage(0,0,0,Rec.Data))
266 5 {
267 6 //发送出错命令
268 6 Cmd=0x0f;
269 6 SendCmdStr(&Cmd,1);
270 6
271 6 //重新开始接收
272 6 goto restart;
273 6 }
274 5 else //页写flash成功
275 5 {
276 6 Rec.DataLen=0; //数据长度清0
277 6 }
278 5 }
279 4
280 4 //发送下载成功命令
281 4 SendCmdStr(&Cmd,1);
282 4
283 4 CommOk=TRUE;
284 4
285 4 break;
286 4
287 4 case 0x07: //下载完成
288 4
289 4 SendCmdStr(&Cmd,1);
290 4
291 4 CommOk=TRUE;
292 4
293 4 break;
294 4
295 4 default: //错误
296 4
297 4 //发送出错命令
298 4 Cmd=0x0f;
299 4 SendCmdStr(&Cmd,1);
300 4
301 4 //重新开始接收
302 4 goto restart;
303 4
C51 COMPILER V7.10 DOWNLOAD 03/30/2007 17:02:48 PAGE 6
304 4 break;
305 4 }
306 3
307 3 //命令接收正常
308 3 if(CommOk)
309 3 {
310 4 Rec.Finish=FALSE; //设定未接收完毕
311 4 Rec.Len=0; //已接收长度
312 4 Rec.CmdLen=0; //PC发给下位机的命令的总长度
313 4 }
314 3 }
315 2 }
316 1 }
317
318 /**********************************************************************
319 * 函 数 名: serial1
320 * 功能描述: 串口1中断处理
321 * 函数说明:
322 * 调用函数: 无
323 * 全局变量:
324 * 输 入: 无
325 * 返 回: 无
326 * 设 计 者: wangyong 日期:2007-03-24
327 * 修 改 者: wangyong 日期:2007-03-24
328 * 版 本:
329 **********************************************************************/
330 void serial1() interrupt 4
331 {
332 1 //接收
333 1 if(RI)
334 1 {
335 2 RI=0;
336 2
337 2 //还没接完
338 2 if(!Rec.Finish)
339 2 {
340 3 //放入数据
341 3 Rec.Buffer[Rec.Len++]=SBUF;
342 3
343 3 //若已接收了4个字节,则可以算出
344 3 //整个命令串的总长度
345 3 if(Rec.Len==4)
346 3 {
347 4 Rec.CmdLen=(uint)(Rec.Buffer[2]*16+Rec.Buffer[3])+2; //命令总长度
348 4 }
349 3 else if(Rec.Len>4) //判断是否全部接收完命令
350 3 {
351 4 //已接收完,做标志
352 4 if(Rec.Len==Rec.CmdLen) Rec.Finish=TRUE;
353 4 }
354 3 }
355 2 }
356 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 884 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 397 37
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
C51 COMPILER V7.10 DOWNLOAD 03/30/2007 17:02:48 PAGE 7
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -