📄 serial.lst
字号:
161 ** 函数名称: GetCharWithoutCheck
162 ** 功能描述: 从读串口消息队列取一字节
163 ** 输 入: 无
164 ** 输 出: temp:从串口消息队列取的字节
165 ** 全局变量: 无
166 ** 调用模块: OSQPend
167 **
168 ** 作 者: 刘宝贵
169 ** 日 期: 2004年4月21日
170 **-------------------------------------------------------------------------------------------------------
171 ** 修改人:
172 ** 日 期:
173 **------------------------------------------------------------------------------------------------------
174 ********************************************************************************************************/
175 uint8 GetCharWithoutCheck(void)
176 {
177 1 uint8 data temp;
178 1 OSQPend(&temp,SerialInData,0); /* 接收一个字节 */
C51 COMPILER V7.06 SERIAL 12/21/2004 15:11:26 PAGE 4
179 1 return(temp);
180 1 }
181
182 /*********************************************************************************************************
183 ** 函数名称: TaskReceive
184 ** 功能描述: 串口接收处理任务
185 ** 输 入: 无
186 ** 输 出: 无
187 ** 全局变量: 无
188 ** 调用模块: 无
189 **
190 ** 作 者: 刘宝贵
191 ** 日 期: 2004年4月20日
192 **-------------------------------------------------------------------------------------------------------
193 ** 修改人:
194 ** 日 期:
195 **------------------------------------------------------------------------------------------------------
196 ********************************************************************************************************/
197 void TaskReceive(void)
198 {
199 1 uint8 code head[4] = {0xEB,0x90,0xEB,0x90};
200 1 OSQCreate(SerialInData,100); /* 建立所需要的消息队列 */
201 1 OSQCreate(SerialOutData,200);
202 1 while (1)
203 1 {
204 2 uint8 xdata state=0;
205 2 while (1)//识别报文头
206 2 {
207 3 if(head[state] == GetCharWithoutCheck())
208 3 state++;
209 3 else
210 3 state=0;
211 3 if(state==4)
212 3 break;
213 3 }//while (1)//识别报文头
214 2 rtn=RIGHT; /* 返回码置初值 */
215 2 inchk = 0xeb^0x90^0xeb^0x90; /* 初始化校验和 */
216 2 if(Address == GetCharWithCheck()) /* 如果地址正确则继续 */
217 2 {
218 3 uint8 data i;
219 3 uint8 xdata length;
220 3 cid = GetCharWithCheck();
221 3 length = GetCharWithCheck();
222 3 if (length>100)
223 3 {
224 4 length=100;
225 4 }
226 3 for (i=0;i<length;i++) // 接收数据区数据
227 3 {
228 4 buf[i]=GetCharWithCheck();
229 4 }
230 3 i = GetCharWithoutCheck();
231 3 if (inchk != i && i!=0x55) // 判断校验和 0x55 为不校验
232 3 {
233 4 rtn = CHKSUM_ERROR;
234 4 }
235 3 if (0x0d != GetCharWithoutCheck()) // 判断报文尾
236 3 {
237 4 rtn = TYPE_ERROR;
238 4 }
239 3 EN_485 = 0;
240 3 OSWait(K_TMO,(5*OS_TICKS_PER_SEC)/1000); //delay15ms
C51 COMPILER V7.06 SERIAL 12/21/2004 15:11:26 PAGE 5
241 3 if(rtn==1)//如果报文的校验和,类型正确
242 3 {
243 4 CommCounter = 0;
244 4 switch (cid)
245 4 {
246 5 case 0: // 握手命令
247 5 {
248 6 CommSendInfo();
249 6 }break;
250 5 }//switch (cid)
251 4 }//if(rtn==1)//如果报文的校验和,类型正确]
252 3 else//如果校验和或类型不正确
253 3 {
254 4 CommSendInfo();
255 4 }
256 3 }//if (Address == GetCharWithCheck())
257 2 }//while (1)
258 1 }//void TaskReceive(void)
259 /*********************************************************************************************************
260 ** 函数名称: comm
261 ** 功能描述: 串口中断处理程序
262 ** 输 入: 无
263 ** 输 出: 无
264 ** 全局变量: 无
265 ** 调用模块: 无
266 **
267 ** 作 者: 刘宝贵
268 ** 日 期: 2004年4月20日
269 **-------------------------------------------------------------------------------------------------------
270 ** 修改人:
271 ** 日 期:
272 **------------------------------------------------------------------------------------------------------
273 ********************************************************************************************************/
274 #if EN_OS_INT_ENTER >0
#pragma disable /* 除非最高优先级中断,否则,必须加上这一句
- */
#endif
277 void comm(void) interrupt 4
278 {
279 1 uint8 data temp;
280 1 if(EN_485 == 1)//EN_485==1:通信处于接收状态
281 1 {
282 2 if (RI0 == 1)
283 2 {
284 3 #if EN_OS_INT_ENTER >0
OS_INT_ENTER();
#endif
287 3 RI0 = 0;
288 3 OSQIntPost(SerialInData,SBUF0);
289 3 OSIntExit();
290 3 return;
291 3 }
292 2 }
293 1 else
294 1 {
295 2 RI0 = 0;
296 2 }
297 1 if (TI0 == 1)
298 1 {
299 2 TI0 = 0;
300 2 if (OSQAccept(&temp,SerialOutData) == OS_Q_OK)
301 2 {
C51 COMPILER V7.06 SERIAL 12/21/2004 15:11:26 PAGE 6
302 3 SBUF0 = temp;
303 3 }
304 2 else
305 2 {
306 3 SerialCanSend = 1;
307 3 EN_485 = 1;
308 3 }
309 2 }
310 1 }
311
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 436 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = 400 2
PDATA SIZE = ---- ----
DATA SIZE = 4 4
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -