📄 udisk.lst
字号:
C51 COMPILER V7.06 UDISK 07/01/2007 16:03:04 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE UDISK
OBJECT MODULE PLACED IN udisk.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE udisk.c COMPACT BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 //#include "stdafx.h"
3 //#include "CommPort.h"
4 //extern CCommPort Comm;
5 //#define SendResponse(buff,len) Comm.SendData(buff, NULL, len, 10000, 1, 0, FALSE); //发送数据
6
7 #include "config.h"
8 #include "string.h"
9 #include "udisk.h"
10
11
12 #ifndef NULL
#define NULL 0
#endif
15
16 #define MAX_FILE_SIZE 512
17 #define WAIT_TIME_OUT 0x2fff
18
19
20 FHANDLE g_handle={0xff,0};
21
22
23 CONTR_DISK rwdisk;
24 void SendResponse(uint8 *buff,uint16 len);
25 void FreeFHandle(void);
26 void ReceOneChar(uint8 ReceChar);
27
28 /*********************************************************************************************************
29 ** 函数名称: wait_ack
30 ** 功能描述: 等待应答帧
31 **
32 ** 输 入: 无
33 ** 输 出: 正常应答返回:TRUE,超时出错返回:FALSE
34 ********************************************************************************************************/
35 uint8 wait_ack(void)
36 {
37 1 uint32 i;
38 1 rwdisk.state = 0;
39 1
40 1 for(i=0;i<WAIT_TIME_OUT;i++) // 软件延时等待
41 1 {
42 2 if(0xff==rwdisk.state)
43 2 return TRUE;
44 2 }
45 1 return FALSE;
46 1 }
47
48 /*
49 uint8 wait_ack(void)
50 {
51 uint8 rt = TRUE ,ret;
52 uint32 i;
53 rwdisk.state = 0;
54 uint8 tempbuff[512];
55 while(0xff!=rwdisk.state)
C51 COMPILER V7.06 UDISK 07/01/2007 16:03:04 PAGE 2
56 {
57 ret = Comm.ReadBlock(tempbuff, 6,500); // 读出数据
58 if(ret==0)
59 {
60 for(i=0;i<6;i++)
61 ReceOneChar(tempbuff[i]);
62 }
63 else
64 {
65 rt = FALSE;
66 break;
67 }
68
69 if(rwdisk.rlen==0)
70 break;
71 ret = Comm.ReadBlock(tempbuff, rwdisk.rlen,500); // 读出数据
72 if(ret==0)
73 {
74 for(i=0; i<rwdisk.rlen; i++)
75 ReceOneChar(tempbuff[i]);
76 }
77 else
78 {
79 rt = FALSE;
80 break;
81 }
82 }
83 return rt;
84 }
85 */
86 //********************************************************************************************************
87 // 函数名称:ReceOneChar
88 // 输入参数:ReceCharacter
89 // 输出参数:无
90 // 功能描述:接收一个字符处理
91 // 要求:接收到一个字符后立即传入该函数处理。
92 //********************************************************************************************************
93 void ReceOneChar(uint8 ReceChar)
94 {
95 1 static uint8 HFNumber = 0;
96 1 static uint8 HFBuffer[6];
97 1 static uint16 DataLen;
98 1 static uint8 state=0;
99 1
100 1 if(rwdisk.state!=0)
101 1 return;
102 1
103 1 switch(state)
104 1 {
105 2 case 0:
106 2 HFBuffer[HFNumber++] = ReceChar;
107 2 if(HFBuffer[0]!='S') //
108 2 if( HFNumber == 2 )
109 2 if(HFBuffer[1]!=':')
110 2 HFNumber = 0;
111 2 if( HFNumber == 6 )
112 2 { HFNumber = 0;
113 3 rwdisk.cmd = HFBuffer[2];
114 3 rwdisk.cmds = HFBuffer[3];
115 3 DataLen = HFBuffer[4] + HFBuffer[5]*0x100;
116 3 rwdisk.rlen = DataLen;
117 3 rwdisk.wlen = 0;
C51 COMPILER V7.06 UDISK 07/01/2007 16:03:04 PAGE 3
118 3 if(DataLen!=0)
119 3 {
120 4 state = 1;
121 4 }
122 3 else
123 3 {
124 4 rwdisk.state = 0xff; // 设置状态
125 4 }
126 3 }
127 2 break;
128 2 case 1:
129 2 rwdisk.write_ptr[rwdisk.wlen++] = ReceChar;
130 2 if(DataLen==rwdisk.wlen)
131 2 {
132 3 rwdisk.state = 0xff; // 设置状态
133 3 state = 0;
134 3 }
135 2 break;
136 2 default :
137 2 break;
138 2 }
139 1 }
140
141
142 void DriverIni(void)
143 {
144 1 FreeFHandle(); // 释入文件句柄
145 1 rwdisk.state = 0xff; // 不接收串口数据
146 1 }
147
148 /*********************************************************************************************************
149 ** 函数名称: GetFHandle
150 ** 功能描述: 获取文件操作包柄
151 **
152 ** 输 入: 无
153 ** 输 出: 无
154 ********************************************************************************************************/
155 FHANDLE *GetFHandle(void)
156 {
157 1 if(g_handle.fh==0xff)
158 1 return &g_handle;
159 1 else
160 1 return NULL;
161 1 }
162
163 /*********************************************************************************************************
164 ** 函数名称: FreeFHandle
165 ** 功能描述: 释放文件操作句柄
166 **
167 ** 输 入: 无
168 ** 输 出: 无
169 ********************************************************************************************************/
170 void FreeFHandle(void)
171 {
172 1 g_handle.fh = 0xff;
173 1 g_handle.fsize = 0;
174 1 }
175
176
177
178
179
C51 COMPILER V7.06 UDISK 07/01/2007 16:03:04 PAGE 4
180 /*********************************************************************************************************
181 ** 函数名称: GetDiskInfo
182 ** 功能描述: 获取系统信息
183 **
184 ** 输 入: sysinfptr:系统信息数据结构指针
185 ** 输 出: 正常设置返回:TRUE,出错返回:FALSE
186 ********************************************************************************************************/
187 uint8 GetDiskInfo(SYSINF *sysinfptr)
188 {
189 1 uint8 reqbuff[14];
190 1
191 1 reqbuff[0] = 'U'; reqbuff[1]= ':'; reqbuff[2] = 0x00;
192 1 reqbuff[3] = 0; reqbuff[4] = 0; reqbuff[5] = 0;
193 1 SendResponse(reqbuff,6); // 发送命令请求帧
194 1 sysinfptr->DiskIn = 0; // 标记U盘不存在
195 1 rwdisk.write_ptr = reqbuff;
196 1
197 1 if(wait_ack()) // 等待应答
198 1 {
199 2 if(rwdisk.cmds==0)
200 2 { sysinfptr->Baud = reqbuff[0];
201 3 sysinfptr->Year = reqbuff[1];
202 3 sysinfptr->Month= reqbuff[2];
203 3 sysinfptr->Dom = reqbuff[3];
204 3 sysinfptr->Hour = reqbuff[4];
205 3 sysinfptr->Min = reqbuff[5];
206 3 sysinfptr->Sec = reqbuff[6];
207 3
208 3 sysinfptr->DiskIn= reqbuff[7];
209 3 sysinfptr->FH.fh= reqbuff[8];
210 3 sysinfptr->FH.fsize= reqbuff[9]+
211 3 reqbuff[10]*0x100+
212 3 reqbuff[11]*0x10000+
213 3 reqbuff[12]*0x1000000;
214 3 sysinfptr->version = reqbuff[13];
215 3 return TRUE;
216 3 }
217 2 }
218 1
219 1 return FALSE;
220 1 }
221
222 /*********************************************************************************************************
223 ** 函数名称: SetDiskInfo
224 ** 功能描述: 设置系统信息
225 **
226 ** 输 入: sysinfptr:系统信息数据结构指针
227 ** 输 出: 正常设置返回:TRUE,出错返回:FALSE
228 ********************************************************************************************************/
229 uint8 SetDiskInfo(SYSINF *sysinfptr)
230 {
231 1 uint8 reqbuff[13];
232 1 reqbuff[0] = 'U'; reqbuff[1]= ':'; reqbuff[2] = 0x01;
233 1 reqbuff[3] = 0; reqbuff[4] = 7; reqbuff[5] = 0;
234 1
235 1 reqbuff[6] = sysinfptr->Baud ;
236 1 reqbuff[7] = sysinfptr->Year ;
237 1 reqbuff[8] = sysinfptr->Month;
238 1 reqbuff[9] = sysinfptr->Dom;
239 1 reqbuff[10] = sysinfptr->Hour;
240 1 reqbuff[11] = sysinfptr->Min;
241 1 reqbuff[12] = sysinfptr->Sec;
C51 COMPILER V7.06 UDISK 07/01/2007 16:03:04 PAGE 5
242 1
243 1 SendResponse(reqbuff,13); // 发送命令请求帧
244 1
245 1 rwdisk.write_ptr = reqbuff;
246 1 if(wait_ack())// 等待应答
247 1 {
248 2 if(rwdisk.cmds==0)
249 2 {
250 3 return TRUE;
251 3 }
252 2 }
253 1
254 1 return FALSE;
255 1 }
256
257 /*********************************************************************************************************
258 ** 函数名称: FileOpen
259 ** 功能描述: 以指定方式打开文件
260 **
261 ** 输 入: DirFileName:用户使用的文件名
262 ** 输 出: 文件句柄,NULL为不能打开
263 ** 非零值为打开文件的指针
264 **
265 ********************************************************************************************************/
266 FHANDLE *FileOpen(char *DirFileName)
267 {
268 1 uint8 reqbuff[6];
269 1 uint8 namelen;
270 1 FHANDLE *handle;
271 1 handle = GetFHandle();
272 1 if(handle==NULL) // 没有可用的包柄
273 1 return handle;
274 1 reqbuff[0] = 'U';reqbuff[1]= ':';
275 1 reqbuff[2] = 0x10;reqbuff[3] = 0xff;
276 1 namelen = strlen(DirFileName); // 获取文件名字符串长度
277 1 reqbuff[4] = namelen; reqbuff[5] = 0;
278 1
279 1 SendResponse(reqbuff,6); // 发送命令请求帧
280 1 SendResponse((uint8*)DirFileName,namelen); // 发送命令请求帧
281 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -