找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2073|回复: 2
收起左侧

51单片机C语言指针数组发送的疑惑

[复制链接]
ID:120930 发表于 2018-12-26 23:17 | 显示全部楼层 |阅读模式
请大侠指点迷津:在串口中断服务函数里比如当串口接收到数据4时,程序依次执行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)这个函数了,此时TI=0,RI=0,cmdArrived=0,主程序就停在17的位置了,此时第72行就执行了一次,就发送了数组的首地址的数据,然而事实上是都发送完了。请大侠指导一下,谢谢

各位大侠先看代码
1,#include <reg52.h>

2,bit cmdArrived = 0;   //命令到达标志,即接收到上位机下发的命令
3,unsigned char cmdIndex = 0;//命令索引,与上位机约定好的数组编号
4,unsigned char *ptrTxd;//串口发送指针
5,unsigned char cntTxd = 0;//串口发送计数器

6,unsigned char array1[1] = {1};   //数组1
7,unsigned char array2[2] = {1,2}; //数组2
8,unsigned char array3[4] = {1,2,3,4}; //数组3
9,unsigned char array4[8] = {1,2,3,4,5,6,7,8};//数组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) 串口接收到数据标志为真
18,        {
19,            cmdArrived = 0;
20,            switch(cmdIndex) //cmdIndex为串口接收的数值
21,            {
22,                case 1:
23,                ptrTxd = array1;//数组1的首地址赋值给发送指针
24,                cntTxd = sizeof(array1);//数组1的长度赋值给发送计数器
25,                TI = 1;//手动方式启动发送中断,处理数据发送
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 //串口中断服务函数
60,{
61,    if (RI)  //接收到字节
62,    {
63,        RI = 0;  //清零接收中断标志位
64,        cmdIndex = SBUF; //接收的数值送给cmdIndex
65,        cmdArrived = 1;  //设置命令到达标志     
66,    }
67,    if (TI)  //字节发送完毕
68,    {
69,        TI = 0;  //清零发送中断标志位
70,        if(cntTxd > 0)
71,        {
72,            SBUF = *ptrTxd;//发送指针指向的数据
73,            cntTxd--;//发送计数器递减
74,            ptrTxd++;//发送计数器递增
75,        }

    }
}


回复

使用道具 举报

ID:120930 发表于 2018-12-27 09:07 | 显示全部楼层
这个程序是用串口调试助手对单片机发送1,单片机回传数组1.对单片机发送2,单片机回传数组2.依次类推,最多到4
回复

使用道具 举报

ID:120930 发表于 2018-12-27 09:10 | 显示全部楼层
这个程序是串口调试助手对单片机发送1 单片机回传数组1. 对单片机发送2 单片机回传数组2. 对单片机发送3 单片机回传数组3.  对单片机发送4 单片机回传数组4
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表