串口通信:labview 向单片机发送一个百位数问题

[复制链接]
6217|36
 楼主| 虚拟小张 发表于 2013-5-16 15:54 | 显示全部楼层 |阅读模式
各位高手,我想通过labview向单片机发送一个百位数(任意一个百位数),通过串口中断,存储在数组中,然后在数码管上显示,老是显示不出来,不知道问题出在哪里哈?我感觉是接收到数组中百位数的数字不对。有没有更好的方法哈。烦死了,求解哈!!!!!!

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char a[3];
uchar flag;
void delay_20ms(uint t)
{
        uchar j;
        for(;t>0;t--)
        for(j=6245;j>0;j--);
}

/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
        SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收
        TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
        TH1 = 0xFD; // TH1: 重装值2400 波特率晶振12MHz
        TR1 = 1; // TR1: timer 1 打开
        EA = 1; //打开总中断
        ES = 1; //打开串口中断
}




/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
        unsigned char i;
        unsigned int j;
        InitUART();
        if(flag==1)
        {
                ES=0;
                flag=0;
       
                        SBUF=a[0];
                        P0=SBUF;
                        P2=0x04;
                        delay_20ms(20);
                        SBUF=a[1];
                        P0=SBUF;
                        P2=0x05;
                        delay_20ms(20);
                        SBUF=a[2];
                        P0=SBUF;
                        P2=0x06;
                        delay_20ms(20);

                                
                 ES=1;
        }
}                                                            

/*------------------------------------------------
串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
        unsigned char i;
        if(RI) //判断是接收中断产生
        {
                a[i]=SBUF;
                i++;
                if(i==3) i=0;
                flag=1;
                RI=0; //标志位清零                
        }
}
 楼主| 虚拟小张 发表于 2013-5-16 15:55 | 显示全部楼层
顶一下,别沉了
spydf 发表于 2013-5-16 16:43 | 显示全部楼层
中断服务子程序变量i定义成静态变量
gxs64 发表于 2013-5-16 16:46 | 显示全部楼层
labview设置对?
ayb_ice 发表于 2013-5-16 16:57 | 显示全部楼层
SBUF是个特殊的东西,其实有两个SBUF一个只读,一个只写,分别用于接收与发送的,读写代表不同的操作,

普通RAM写数据后再读出来数据是一样的,但SBUF可不是这样的
ayb_ice 发表于 2013-5-16 16:58 | 显示全部楼层
3L说的也很对
ayb_ice 发表于 2013-5-16 17:00 | 显示全部楼层
本帖最后由 ayb_ice 于 2013-5-16 17:01 编辑

你一位显示延时delay_20ms(20);

这么长时间20*20=400ms,怎么可能能正常显示呢

3位总共是1.2S了,这么长的时间关了中断,上位机发数据岂不是收不到了
 楼主| 虚拟小张 发表于 2013-5-16 17:05 | 显示全部楼层
spydf 发表于 2013-5-16 16:43
中断服务子程序变量i定义成静态变量

还是不行呀。我的想法是将一个百位数(如213)拆分成2,1,3数字,一个个发送进单片机,然后存储进一个数组,再显示。先发送213,延时,再发送213,感觉我的单片机数组中存储的根本不是2,1,3;况且感觉后面两个数组中的数字可以是2,可以是1,不知道问题出在哪里了?
 楼主| 虚拟小张 发表于 2013-5-16 17:06 | 显示全部楼层
gxs64 发表于 2013-5-16 16:46
labview设置对?

labview设置对呀,我就是搞labview的,这部分没问题。
 楼主| 虚拟小张 发表于 2013-5-16 17:08 | 显示全部楼层
ayb_ice 发表于 2013-5-16 16:57
SBUF是个特殊的东西,其实有两个SBUF一个只读,一个只写,分别用于接收与发送的,读写代表不同的操作,

普通RAM ...

这个我知道哈,我这里只读,就是把缓存区的数读进一个数组中,但感觉读进的数不对哈。
 楼主| 虚拟小张 发表于 2013-5-16 17:11 | 显示全部楼层
ayb_ice 发表于 2013-5-16 17:00
你一位显示延时delay_20ms(20);

这么长时间20*20=400ms,怎么可能能正常显示呢

这个可以收到的,我的上位机是循环发送,如发送2,1,3;2,1,3.。。就照这个顺序。我的问题是我的数组中不能正确的存储2,1,3.我的数码管显示没问题哈。
gxs64 发表于 2013-5-16 17:12 | 显示全部楼层
1.RX TX连线是OK?用示波器测一下,通记时应有波形。
2。能否进入中断?
ayb_ice 发表于 2013-5-16 17:24 | 显示全部楼层
// 中断程序改一下


void UART_SER (void) interrupt 4 //串行中断服务程序
{
        static unsigned char i = 0;

        if(RI) //判断是接收中断产生
        {
                a[i]=SBUF;
                RI=0; //标志位清零

                i++;
                if(i==3) i=0;
                flag=1;
        }

                if(TI){
                        TI = 0;
                }
}
 楼主| 虚拟小张 发表于 2013-5-16 19:06 | 显示全部楼层
ayb_ice 发表于 2013-5-16 17:24
// 中断程序改一下

还是不行哈,显示的是311,前两个数码管闪烁,最后一个显示1,不变。
 楼主| 虚拟小张 发表于 2013-5-16 19:28 | 显示全部楼层
ayb_ice 发表于 2013-5-16 17:24
// 中断程序改一下

高手,如果是向单片机发送0x01,0xD5,这两个十六进制数,如何在中断程序中存储呢?高手,帮帮忙哈。。。
gxs64 发表于 2013-5-16 21:41 | 显示全部楼层
将数据从SBUF读出,存入BUFFER就OK。
NE5532 发表于 2013-5-17 08:14 | 显示全部楼层
呵呵,楼主确实连主循环都没有呢。另外建议数据封装为帧,否则容易混乱。
 楼主| 虚拟小张 发表于 2013-5-17 08:38 | 显示全部楼层
dwh000 发表于 2013-5-17 08:01
主程序都不对,写个循环好不好啊!

高手,主程序的那个循环,我知道。现在的关键问题是,单片机的串口接收到的百位数不对,不知道问题出在哪里哈?
 楼主| 虚拟小张 发表于 2013-5-17 08:39 | 显示全部楼层
NE5532 发表于 2013-5-17 08:14
呵呵,楼主确实连主循环都没有呢。另外建议数据封装为帧,否则容易混乱。 ...

高手,主程序的那个循环,我知道。现在的关键问题是,单片机的串口接收到的百位数不对,不知道问题出在哪里哈?具体如何操作呢?我是新手哈。
 楼主| 虚拟小张 发表于 2013-5-17 08:40 | 显示全部楼层
gxs64 发表于 2013-5-16 21:41
将数据从SBUF读出,存入BUFFER就OK。

高手,主程序的那个循环,我知道。现在的关键问题是,单片机的串口接收到的百位数不对,不知道问题出在哪里哈?具体如何操作呢?我是新手哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部