|
請大俠指點(diǎn)迷津:在串口中斷服務(wù)函數(shù)里比如當(dāng)串口接收到數(shù)據(jù)4時,程序依次執(zhí)行61,62,63,64,65,66,17,18,19,20,21,37,38,39,40,41,67,68,69,70,71,72,73,74,75,然后就跳出67,if(TI)這個函數(shù)了,此時TI=0,RI=0,cmdArrived=0,主程序就停在17的位置了,此時第72行就執(zhí)行了一次,就發(fā)送了數(shù)組的首地址的數(shù)據(jù),然而事實(shí)上是都發(fā)送完了。請大俠指導(dǎo)一下,謝謝
各位大俠先看代碼
1,#include <reg52.h>
2,bit cmdArrived = 0; //命令到達(dá)標(biāo)志,即接收到上位機(jī)下發(fā)的命令
3,unsigned char cmdIndex = 0;//命令索引,與上位機(jī)約定好的數(shù)組編號
4,unsigned char *ptrTxd;//串口發(fā)送指針
5,unsigned char cntTxd = 0;//串口發(fā)送計數(shù)器
6,unsigned char array1[1] = {1}; //數(shù)組1
7,unsigned char array2[2] = {1,2}; //數(shù)組2
8,unsigned char array3[4] = {1,2,3,4}; //數(shù)組3
9,unsigned char array4[8] = {1,2,3,4,5,6,7,8};//數(shù)組4
10,void ConfigUART(unsigned int baud);
11,void main()
12,{
13, EA = 1; //開總中斷
14, ConfigUART(9600); //配置波特率為9600
15, while (1)
16, {
17, if(cmdArrived) 串口接收到數(shù)據(jù)標(biāo)志為真
18, {
19, cmdArrived = 0;
20, switch(cmdIndex) //cmdIndex為串口接收的數(shù)值
21, {
22, case 1:
23, ptrTxd = array1;//數(shù)組1的首地址賦值給發(fā)送指針
24, cntTxd = sizeof(array1);//數(shù)組1的長度賦值給發(fā)送計數(shù)器
25, TI = 1;//手動方式啟動發(fā)送中斷,處理數(shù)據(jù)發(fā)送
26, break;
27, case 2:
28, ptrTxd = array2;
29, cntTxd = sizeof(array2);
30, TI = 1;
31, break;
32, case 3:
33, ptrTxd = array3;
34, cntTxd = sizeof(array3);
35, TI = 1;
36, break;
37, case 4:
38, ptrTxd = array4;
39, cntTxd = sizeof(array4);
40, TI = 1;
41, break;
42, default:
43, break;
44, }
45, }
46,}
47,}
48,void ConfigUART(unsigned int baud)
49,{
50, SCON = 0x50; //配置串口為模式1
51, TMOD &= 0x0F; //清零T1的控制位
52, TMOD |= 0x20; //配置T1為模式2
53, TH1 = 256 - (11059200/12/32)/baud; //計算T1重載值
54, TL1 = TH1; //初值等于重載值
55, ET1 = 0; //禁止T1中斷
56, ES = 1; //使能串口中斷
57, TR1 = 1; //啟動T1
58,}
59,void InterruptUART() interrupt 4 //串口中斷服務(wù)函數(shù)
60,{
61, if (RI) //接收到字節(jié)
62, {
63, RI = 0; //清零接收中斷標(biāo)志位
64, cmdIndex = SBUF; //接收的數(shù)值送給cmdIndex
65, cmdArrived = 1; //設(shè)置命令到達(dá)標(biāo)志
66, }
67, if (TI) //字節(jié)發(fā)送完畢
68, {
69, TI = 0; //清零發(fā)送中斷標(biāo)志位
70, if(cntTxd > 0)
71, {
72, SBUF = *ptrTxd;//發(fā)送指針指向的數(shù)據(jù)
73, cntTxd--;//發(fā)送計數(shù)器遞減
74, ptrTxd++;//發(fā)送計數(shù)器遞增
75, }
}
}
|
|