📄 scomservice.lst
字号:
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE SCOMSERVICE
OBJECT MODULE PLACED IN ScomService.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ScomModule\ScomService.c BROWSE DEBUG OBJECTEXTEND PRINT(.\ScomService.lst)
- OBJECT(ScomService.obj)
line level source
1 /*#######################################################################################//
2 文件名: ScomService.c
3 功能: 串行通信服务函数实现
4 单位: 浙江工商大学-信电学院
5 创建日期:2004-09-24
6 创建人: Houseivan
7 修改人: Houseivan
8 修改日期:2005-03-11
9 ########################################################################################*/
10 //##########################智能数据采集系统串行通讯协议简要:############################//
11 //#数据帧帧头:0xEB 0x90 0xEB 0x90 0xEB 0x90
12 //#有效数据块:远程主机地址 本地主机地址 命令 参数和校验数据总长度 命令参数
13 //#帧序号(FrameNumHigh FrameNumLow) 校验码(CRCHigh CRCLow)#
14 //#数据帧帧尾:0x7E /*SCOM空闲时保持Mark状态即逻辑'1'*/
15 //#######################################################################################//
16 #include"Includes.h"
17 /*检测是否配置了网络通信功能*/
18 #if _SCOM_TASK>0
19
20 extern uchar code FrameHead[]; //协议帧头
21
22 extern uchar data TempInteger; //温度值整数和符号字节
23 extern uchar data TempDecimal; //温度值小数位字节
24 extern uchar data HumiInteger; //湿度值整数和符号字节
25 extern uchar data HumiDecimal; //湿度值小数位字节
26 extern uchar data UartRecBuf[]; //数据通讯缓冲器
27 extern uchar data ClkLcmBuf[_MAX_LCM_NUM]; //显示和时钟操作缓冲器
28 extern uchar data DataBlockCount; //接收缓冲中有效数据个数
29 extern uchar data RecUpFlg; //接收数据用标志变量
30 extern uchar data UartHead; //接收检验帧头存放变量
31 extern uchar data SystemState; //当前系统工作状态指示变量
32 extern uchar data SlaveAddr; //本地主机地址
33 extern uchar data MasterAddr; //远程主机地址
34 extern uchar data CurRecNum; //记录计数器 循环队列形式
35 extern uchar data LcmMode; //显示模式选择
36
37 extern bit RecReady; //正确的数据接收完成标志
38 extern bit WorkMode;
39 #if(_SCOM_TEST>0)
extern uchar TestCom;
#endif //根据登陆成功与否确定站点工作的模式
42
43 #endif
44 /*检测是否配置了网络通信功能*/
45 #if _SCOM_TASK>0
46
47 //#######################################################################################//
48 //#include "ScomService.h"
49 //#######################################################################################//
50 //#Function: void Uart0Init(void)
51 //#Description: 51串行口初始化
52 //#Input: 无
53 //#Output: 无
54 //#Return: 无
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 2
55 //#Others: 文件级公共函数
56 //#SBUF-串行口数据寄存器;TMOD,T2MOD,TCON,T2CON设置波特率发生器的工作方式
57 //#SCON-串行控制寄存器[7..0]=SM0 SM1 SM2 REN TB8 RB8 TI RI
58 //#PCON-电源控制寄存器[7..0]=SMOD - - - GF1 GF0 PD ID
59 //#IE -中断允许控制寄存器[7..0]=EA -ET2 ES ET1 EX1 ET0 EX0
60 //#######################################################################################//
61 void Uart0Init(void)
62 {
63 1 /*公共属性设置寄存器*/
64 1 ChooseScomMode1();
65 1 #if _RATE_ADJUST_EN>0
66 1 #if (_BAUD_TIMER>0) //52模式可以选择T1或T2作为波特率发生器
67 1 T2CON|=0x30; //作为波特率发生器RCLK=TCLK=1
68 1 //T2MOD|=;
69 1 TH2 =_T2_HIGH;
70 1 TL2 =_T2_LOW ;
71 1 RCAP2H=_T2_HIGH;
72 1 RCAP2L=_T2_LOW ;
73 1 TR2 = 1;
74 1 #else //51模式只能采用T1做波特率发生器
TCON&=0x0f ; //清除标志位
TMOD|=0x20 ; //mode2 BR=(2^smod)*fsoc/(32*12*(MAX-Ti))
TH1 =_T1_HIGH ;
TL1 =_T1_LOW ;
TR1 = 1;
#endif
81 1 #endif
82 1 RecReady=0;
83 1 DataBlockCount=0;
84 1 RecUpFlg=0;
85 1 UartHead=0xeb;
86 1 AllowRx();
87 1 OpenScom();
88 1 EA=1;
89 1 }
90 //##################################################
91 //#Function: SendByte
92 //#Description:51串行口字节发送函数
93 //#Input: 无
94 //#Output: 无
95 //#Return: 无
96 //#Others: 文件级公共函数
97 //##################################################
98 void SendByte(uchar sdata)
99 {
100 1 AllowTx();
101 1 TI=0;
102 1 SBUF=sdata;
103 1 while(!TI);
104 1 TI=0;
105 1 AllowRx();
106 1 }
107
108 //##################################################
109 //#Function: LoginMaster
110 //#Description:登陆到系统服务器
111 //#Input: 无
112 //#Output: 无
113 //#Return: 无
114 //#Others: 文件级公共函数
115 //##################################################
116 bit LoginMaster(void)
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 3
117 {
118 1 bit rel=0;
119 1 CallMaster(_CMD_LOG_IN); //发送帧到PC
120 1 /*等待PC响应的登陆成功反馈信息*/
121 1 DelayTime(2,1000); //等待反馈
122 1 if(ProcessFrameTask()==_CMD_ACK) //登陆成功标志
123 1 rel=_NET_MODE;
124 1 return rel;
125 1 }
126
127 //##################################################
128 //#Function: SendFrame(uchar *UartRecBuf,uchar Len)
129 //#Description:带上头对数据进行校验计算,按协议打包数据发送帧到PC
130 //#Input: 数据存储缓冲首地址,数据长度
131 //#Output: 无
132 //#Return: 无
133 //#Others: 文件级公共函数UartRecBuf[0]:Cmd,UartRecBuf[1]:Len
134 //##################################################
135 void SendFrame(uchar *UartBuf,uchar Len)
136 {
137 1 uchar nCount;
138 1 uint nCrc;
139 1
140 1 CloseScom();
141 1
142 1 nCrc=CRCverify(UartBuf,Len);
143 1 for(nCount=0;nCount<_F_HEAD_SIZE;nCount++)
144 1 SendByte(FrameHead[nCount]); //发送固定的头
145 1 for(nCount=0;nCount<Len;nCount++)
146 1 {
147 2 SendByte(UartBuf[nCount]); //发送数据
148 2 UartBuf[nCount]=0x00; //然后清空单元
149 2 }
150 1 SendByte(nCrc/256);
151 1 SendByte(nCrc%256);
152 1
153 1 SendByte(_CMD_END); //发送固定尾
154 1
155 1 OpenScom();
156 1 }
157
158 //##################################################
159 //#Function: CallMaster
160 //#Description:主动呼叫主机发送命令和数据进行通讯
161 //#Input: 呼叫类型
162 //#Output: 无
163 //#Return: 无
164 //#Others: 文件级公共函数,它负责将要发送的数据整合到缓冲中
165 //##################################################
166 void CallMaster(uchar nCmd)
167 {
168 1 uchar nCount;
169 1 #if ((_DETECT_TASK>0)&&(_E2PROM_TASK>0))
170 1 uchar i;
171 1 #endif
172 1
173 1 CloseScom(); //禁止中断保护共享缓冲
174 1 nCount=0;
175 1 UartRecBuf[nCount++]=SlaveAddr; //发送人
176 1 UartRecBuf[nCount++]=MasterAddr;
177 1 UartRecBuf[nCount++]=nCmd;
178 1 switch(nCmd)
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 4
179 1 {
180 2 case _CMD_WR_TEMP: //LENG == 2
181 2 #if _DETECT_TASK>0
182 2 UartRecBuf[nCount++]=2+_F_EXTRA_LEN;
183 2 UartRecBuf[nCount++]=TempInteger;
184 2 UartRecBuf[nCount++]=TempDecimal;
185 2 UartRecBuf[nCount++]=_F_SINGLE_NUM;
186 2 #else
UartRecBuf[nCount++]=_F_EXTRA_LEN; //表示数据长度0一个序号和Crc常数
UartRecBuf[nCount++]=_F_SINGLE_NUM; //It's a single frame
#endif
190 2 break;
191 2 case _CMD_WR_HUMI: //LENG == 2
192 2 #if _DETECT_TASK>0
193 2 UartRecBuf[nCount++]=2+_F_EXTRA_LEN;
194 2 UartRecBuf[nCount++]=HumiInteger;
195 2 UartRecBuf[nCount++]=HumiDecimal;
196 2 UartRecBuf[nCount++]=_F_SINGLE_NUM;
197 2 #else
UartRecBuf[nCount++]=_F_EXTRA_LEN; //表示数据长度0一个序号和Crc常数
UartRecBuf[nCount++]=_F_SINGLE_NUM; //It's a single frame
#endif
201 2 break;
202 2 case _CMD_WR_TIME: //LENG == 3
203 2 #if _CLOCK_TASK>0
204 2 ReadClock(ClkLcmBuf);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -