?? 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 + -