5358|18

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于C51 串口通讯的问题(中断) [复制链接]

    大家好!第一次发帖子,希望能够共同解决问题。
    关于单片机之间的通讯,大家通常会选择用查询法来发送数据,用中断法来接收数据。但是我现在是碰到一个难题了,希望能够用中断法来接收和发送数据。查过一些资料里面都很少有这样的方式通讯。不知道有没有哪位做过相关的程序设计,希望能够指点一下。
void serial()interrput 4
{
    uchar a,b=0xEA;
    if(RI)
    {
         RI=0;
         a=SBUF;
    }
    if(TI)
    {
        TI=0;
        SBUF=b;
    }
}


一个最简单的接收和发送的程序,这样对吗?请指教!谢谢

最新回复

一般接收采用中断,发送采用查询!  详情 回复 发表于 2009-9-28 12:20
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
中断发送最关键的是发送中断的使能

要发送数据的时候,打开发送中断,发送完成后,要及时关闭发送中断
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这样简单处理会有问题的
因为接受和发送是一个缓冲SBUF,数据量大最起码要个延时
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
请问能不能给个实例啊?
我发现确实是有问题,但是不知道该怎么解决。
平时大家用发送都是用查询法,但是现在要求都用中断的话真的不知道该怎么处理,请指教!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
这是我在做一个基于串口做的无线收发程序,希望对你有帮助.
发:
void SerialPort_Init(void)//serialport setting for the interupt,8 data bits,1 stop bit,no check bit
{
                TMOD=0x20;             //timer1, work in mode 2          
        TH1=0xFD;                   //bandrate:9600
                TL1=0xFD;                                       
            SCON=0x40;                 // serial port set in mode 1:10bits baund rate defined by timer
        PCON=0x00;                 // sinle frequence
                IE=0x90;         // EA=0;   enable serial port interrupt       
                TR1=1;                         //start timer1
}

void Send_Char(uchar serial_char)
{
        TI =0 ;
        SBUF =serial_char;
        while(TI==0);                
        TI =0 ;
        delayms(1);
}

收:
void SerialPort_Init(void)//serialport setting for the interupt,8 data bits,1 stop bit,no check bit
{
                TMOD=0x20;             //timer1, work in mode 2          
        TH1=0xFD;                   //bandrate:9600
                TL1=0xFD;                                       
            SCON=0x50;                 // serial port set in mode 1:10bits baund rate defined by timer
        PCON=0x00;                 // sinle frequence
                IE=0x90;         // EA=0;   enable serial port interrupt       
                TR1=1;                         //start timer1
}

void Seria_Int() interrupt 4 using 2
{
                /*P0 = SBUF;
                P1 = 0;
                RI = 0;        */
                if(ser_flag==0)
        {
                ES = 0;
                tmp = SBUF;
                RI = 0;       
                //beep = ~beep;
                if (tmp == 0x99)
                        ser_flag = 1;
                P0 = tmp;
                ES = 1;
        }
        else if (ser_flag == 1)
        {
                ES = 0;
                serial_char = SBUF;
                RI = 0;
                beep = ~beep;
                ser_flag = 0;
                ES = 1;
        }               
}
其中有握手信号,LZ觉得没用可以删了它
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
注意发送用中断的话,一串数据的第一个数要通过主程序发,以后再在中断中发其余的数,直到这串数据完。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
     谢谢各位的答复!各位的帖子都很有用,留着也可以给以后遇到相同问题的一个借鉴。
     目前,我已经解决了中断接收,查询发送的通讯问题,但是由于项目中涉及到数码管的动态显示,所以必须要使用中断接收和中断发送来进行通讯。我会继续努力的,也希望有相关编程经验的同仁给出自己的意见和建议。
    如果有什么收获的话,我会贴上来的,继续努力!
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
关注~
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
先进行串口的设置,一般的情况TI位设置为1表示可以进行数据发送,RI设置为0表示可以接收,同时串口的波特率,等参数也需要设置。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
中断发送可以采用Arnold9009说的办法,我在PIC18F单片机上试过,是可行的,要记住发送中断与接收中断,优先级一定要一致,否则很容易出错
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

11
 
void   serial()interrput   4
{
        uchar   a,b=0xEA;
        if(RI)
        {
                  RI=0;
                  a=SBUF;
        }
        if(TI)
        {
                TI=0;
                SBUF=b;   //这里有问题有错误
        }
}



我上次用的是这样做的哈

#define  START_BYTE  0xFF

unsigned char recvBuff[8];
unsigned char txdBuff[8];
unsigned char recvIndex=0;
unsigned char  txdIndex=0;

void   serial()interrput   4
{

        if(RI)
        {
                  RI=0;
                  recvBuff[recvIndex++]=SBUF;
                 recvIndex=recvIndex%8;
        }
        else
        {   if(txdIndex <8)
             {
                TI=0;
                SBUF=txdBuff[txdIndex++];   
               }
              else
              {
                  TI=0;
               }
        }
}


然后在
main()
{
   if(condition )
   {
       SBUF =START_BYTE ;
   }
}



这个是很简单的哈  真正的处理比这个应该很复杂 要设计你的通讯协议。。。。。。  
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

12
 
学习
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
一般来说,接收可以全部放在ISR里面弄,但发送至少一个包的第一个字节要在其它地方发~~~~否则你在ISR里面等待TI变成1永远都等不到的
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

14
 
ding
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(高级)

15
 
不用吧?

好像软件给一个

TI = 1;

机器也傻呼呼地去跑中断

嘿嘿
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
共性问题 可以参考串口小助手的代码
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 14 楼 lbing7 的回复:
不用吧?

好像软件给一个

TI = 1;

机器也傻呼呼地去跑中断

嘿嘿

  是这样的吗? 带会试试, 学习了哈
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
学习
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
一般接收采用中断,发送采用查询!
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表