📄 serial.lst
字号:
C51 COMPILER V7.10 SERIAL 08/03/2006 13:15:14 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 名称:main.c
3 日期:2005.01.12
4 作者:廖志凯
5 功能:
6 说明:程序使用RTX51实时多任务系统,
7 */
8 #pragma large
9 #include "serial.h"
10 /*------------------------------------------------------------------------------*/
11 //定义串口缓冲区
12 uchar xdata cRecvBuff[RECV_GRUOP][RECV_LENGTH]; //接收缓冲区
13 uchar xdata cRecvBuffNum; //已接收数据的字节数
14 uchar xdata cRecvBuffPtr; //接收缓冲区有效数据起始指针
15 uchar xdata cRecvBuffCnt; //接收缓冲区有效数据总数
16
17 uchar xdata cTranBuff[TRAN_GRUOP][TRAN_LENGTH]; //发送缓冲区
18 uchar xdata cTranBuffNum; //已发送数据的字节数
19 uchar xdata cTranBuffPtr; //发送缓冲区有效数据起始指针
20 uchar xdata cTranBuffCnt; //发送缓冲区有效数据总数
21 /*------------------------------------------------------------------------------*/
22 uchar xdata cRecvBuff2[RECV_LENGTH2]; //接收缓冲区
23 uchar xdata cRecvBuffNum2; //已接收数据的字节数
24 uchar xdata cTranBuff2[TRAN_GRUOP2][TRAN_LENGTH2]; //发送缓冲区
25 uchar xdata cTranBuffNum2; //已发送数据的字节数
26 uchar xdata cTranBuffPtr2; //发送缓冲区有效数据起始指针
27 uchar xdata cTranBuffCnt2; //发送缓冲区有效数据总数
28 /*===============================================================
29 功能:串口初始化
30 参数:
31 返回:
32 说明:
33 ===============================================================*/
34 void Init_Serial(void)
35 {
36 1 //初始化串口寄存器
37 1 SCON = 0x50; //模式1,8位通讯,允许接收
38 1 SCON2 = 0x50; //模式1,8位通讯,允许接收
39 1 PCON = 0x00; //SMOD,SMOD1=0;
40 1 TMOD |= 0x20; //模式2,8位自载
41 1 TH1 = 0xFA;
42 1 TL1 = 0xFA; //波特率9600
43 1 TR1 = 1; //启动Timer1
44 1 ET1 = 0; //禁止Timer1中断
45 1 os_enable_isr(SIO_VECTOR);
46 1 os_enable_isr(SI1_VECTOR);
47 1 //os_disable_isr(SI1_VECTOR);
48 1 //初始化缓冲区
49 1 memset(cRecvBuff,0x00,RECV_GRUOP*RECV_LENGTH);
50 1 cRecvBuffNum = 0x00;
51 1 cRecvBuffPtr = 0x00;
52 1 cRecvBuffCnt = 0x00;
53 1 memset(cTranBuff,0x00,TRAN_GRUOP*TRAN_LENGTH);
54 1 cTranBuffNum = 0x00;
55 1 cTranBuffPtr = 0x00;
C51 COMPILER V7.10 SERIAL 08/03/2006 13:15:14 PAGE 2
56 1 cTranBuffCnt = 0x00;
57 1 memset(cRecvBuff2, 0x00, RECV_LENGTH2);
58 1 cRecvBuffNum2 = 0x00;
59 1 memset(cTranBuff2, 0x00, TRAN_GRUOP2*TRAN_LENGTH2);
60 1 cTranBuffNum2 = 0x00;
61 1 cTranBuffPtr2 = 0x00;
62 1 cTranBuffCnt2 = 0x00;
63 1 }
64 /*===============================================================
65 功能:
66 参数:
67 返回:
68 说明:
69 ===============================================================*/
70 void Write_serial_buff(uchar *buff, uchar len)
71 {
72 1 uchar _index;
73 1 if(cTranBuffCnt < TRAN_GRUOP)
74 1 {
75 2 _index = (cTranBuffPtr + cTranBuffCnt) % TRAN_GRUOP;
76 2 memcpy(cTranBuff[_index], buff, len);
77 2 cTranBuffCnt++;
78 2 //os_send_message(MBX_SERAIL_TRAN, 0x00, T10MS);
79 2 }
80 1 }
81
82 /*===============================================================
83 功能:串口0 中断程序
84 参数:无
85 返回:无
86 说明:只给相应任务发送信号
87 ===============================================================*/
88 void Int_Serial0(void) interrupt SIO_VECTOR
89 {
90 1 uchar xdata _index;
91 1 uchar xdata _data;
92 1
93 1 if(RI)
94 1 {//接收中断
95 2 RI = 0;
96 2 _data = SBUF;
97 2 //isr_send_message(MBX_SERAIL_RECV, SBUF);
98 2 if(cRecvBuffCnt < RECV_GRUOP)
99 2 {//接收缓冲区未满
100 3 _index = (cRecvBuffPtr+cRecvBuffCnt) % RECV_GRUOP; //缓冲区的偏移地址
101 3 if(_data == 0xFF)
102 3 {//如果收到起始符
103 4 cRecvBuff[_index][0] = 0xFF;
104 4 cRecvBuffNum = 0x01;
105 4 }
106 3 else if( (cRecvBuffNum > 0x00) && (cRecvBuffNum < RECV_LENGTH) )
107 3 {//其他数据
108 4 cRecvBuff[_index][cRecvBuffNum] = _data;
109 4 cRecvBuffNum++;
110 4 if(cRecvBuffNum == (cRecvBuff[_index][1] + 3) )
111 4 {//接收完毕
112 5 cRecvBuffCnt++;
113 5 cRecvBuffNum = 0x00;
114 5 }
115 4 }
116 3 else if(cRecvBuffNum > RECV_LENGTH)
117 3 {//接收的数据超过缓冲区容量清除当前接收的数据
C51 COMPILER V7.10 SERIAL 08/03/2006 13:15:14 PAGE 3
118 4 cRecvBuffNum = 0x00;
119 4 memset(&cRecvBuff[_index][0],0x00,RECV_LENGTH);
120 4 }
121 3 }
122 2 }
123 1 if(TI)
124 1 {//发送中断
125 2 TI = 0;
126 2 isr_send_signal(STRAN_TASK_ID);
127 2 }
128 1 }
129 /*===============================================================
130 功能:串口1 中断程序
131 参数:无
132 返回:无
133 说明:只给相应任务发送信号
134 ===============================================================*/
135 void Int_Serial1(void) interrupt SI1_VECTOR
136 {
137 1 if(SCON2&0x01)
138 1 {//接收中断
139 2 SCON2 &= 0xFE;
140 2 cRecvBuff2[cRecvBuffNum2] = SBUF2;
141 2 if( ((cRecvBuff2[cRecvBuffNum2] == 'D') || (cRecvBuff2[cRecvBuffNum2] == 'W'))
142 2 && (cRecvBuff2[cRecvBuffNum2-1] == 'D') )
143 2 {//接收到数据头
144 3 cRecvBuff2[0] = 'D';
145 3 cRecvBuff2[1] = cRecvBuff2[cRecvBuffNum2];
146 3 cRecvBuffNum2 = 1;
147 3 }
148 2 else if( (cRecvBuff2[cRecvBuffNum2] == 0x0A) && (cRecvBuff2[cRecvBuffNum2-1] == 0x0D) )
149 2 {//接收完毕
150 3 isr_send_signal(CONFIG_TASK_ID);
151 3 }
152 2 cRecvBuffNum2++;
153 2 }
154 1 if(SCON2&0x02)
155 1 {//发送中断
156 2 SCON2 &= 0xFD;
157 2 isr_send_signal(DEBUG_TASK_ID);
158 2 }
159 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -