打印

s51单片机串口收发的问题

[复制链接]
6369|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hawk20022002|  楼主 | 2010-5-31 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用S51 单片机做的程序片段如下:用的是22。1184M晶振
void init_serialcom( void ) //串口通信初始设定
   {
    SCON = 0x50 ;   //UART为模式1,8位数据,允许接收
    TMOD |= 0x20 ; //定时器1为模式2,8位自动重装
    PCON |= 0x80 ; //SMOD=1;
//    TH1 = 0xFA ;   //Baud:19200 fosc="11".0592MHz
TH1=0XF4  ;      //9600    22.1184m
    IE |= 0x90 ;   //Enable Serial Interrupt
    TR1 = 1 ;       // timer 1 run
      TI=1;

       }

//向串口发送一个字符
void send_char_com( unsigned char ch)
         {
            SBUF=ch;
     
            while (TI== 0);
               TI= 0 ;
          }
  

void DelayMs(unsigned int number) {
     unsigned char temp;
    for(;number!=0;number--)
    {
        for(temp=112;temp!=0;temp--);
      
    }
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
  if(RI)
   {
   RI = 0 ;
    if(n<78)
     
    {
    RcvBuf[n]=SBUF;
    n++;
       }
if(RcvBuf[0]==0xAA&&RcvBuf[7]==0-RcvBuf[1]-RcvBuf[2]-RcvBuf[3]-RcvBuf[4]-RcvBuf[5]-RcvBuf[6])
{  choice_d=1;
                         TR0=1;}
  ch= SBUF;
    DelayMs(5);
           read_flag= 1 ; //就置位取数标志
   
  }      
  
}
main ()
{init_wbzd();
init_serialcom();
while (1){
if(choice_d==1)
  {FWJFYJ();}
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
                                  {
                                 read_flag= 0 ; //取数标志清0
                                    n=0;
                                  send_char_com(ch);
  }
  

}
出现的问题如下:
1.在串口发送一长串数据比如77个,第77个数据为0xab
按程序我想实现调用FWJFYJ();串口调试助手应该收到的数据是0xab
但是现在在使用过程中不定时出现收到的数据是0x?? 0xab (??代表收到的数不一定),出现0x??的情况0XAB要延时约一秒出现,而且FWJFYJ();这个程序调用不正常。
2.我如果把中断中的延时加长比如DelayMs(10);,FWJFYJ();的调用也不正常。
请高手指点下。。。。。。。。。。
!!!

相关帖子

沙发
ayb_ice| | 2010-5-31 09:51 | 只看该作者
//向串口发送一个字符
void send_char_com( unsigned char ch)
         {
            SBUF=ch;
     
            while (TI== 0);
               TI= 0 ;
          }
以上
既然已经使能了串口中断,此处又使用查询,为何
感觉LZ自己写程序都没有一个整体思路
还是先整一下思路吧

使用特权

评论回复
板凳
hawk20022002|  楼主 | 2010-5-31 10:33 | 只看该作者
这个串口发送我只是在程序出现不正常之后,我加上去测试的。。这对程序影响大吗?在没有加这个发送程序之前,FWJFYJ();的调用就不正常

使用特权

评论回复
地板
ayb_ice| | 2010-5-31 10:46 | 只看该作者
再者,串口中断居然没有清TI

使用特权

评论回复
5
hawk20022002|  楼主 | 2010-5-31 11:16 | 只看该作者
清TI?是不是说要在  read_flag= 1 ; 后加TI=0;我加了试了下,显示全是乱码,发送的数也不正常

使用特权

评论回复
6
hawk20022002|  楼主 | 2010-5-31 11:21 | 只看该作者
我在RI=0;之后加了TI=1;没有什么改善啊,还是不定时的出现收到2个数的情况,只要出现收到2个数,显示就不正常了

使用特权

评论回复
7
hawk20022002|  楼主 | 2010-5-31 11:29 | 只看该作者
如果我不在中断之中加延时的话,就会收到4个数,延时加长了,显示又不正常了

使用特权

评论回复
8
hawk20022002|  楼主 | 2010-5-31 11:32 | 只看该作者
我不调用发送的程序,显示也会不定期出现,发送了数据不显示的问题,就是FWJFYJ()这个子程序没有被调用

使用特权

评论回复
9
ayb_ice| | 2010-5-31 11:36 | 只看该作者
如果不清TI,串口会不停的中断
总之程序乱套,现象当然乱套

使用特权

评论回复
10
hawk20022002|  楼主 | 2010-5-31 11:45 | 只看该作者
你说的清TI能具体点怎么清吗?在末尾加TI=1?

使用特权

评论回复
11
cbing2000| | 2010-5-31 11:46 | 只看该作者
回复试贴!~

使用特权

评论回复
12
ayb_ice| | 2010-5-31 13:23 | 只看该作者
建议还是先去看书吧

使用特权

评论回复
13
rzm2001| | 2010-5-31 14:37 | 只看该作者
参照一下书吧,简单的串行通信

使用特权

评论回复
14
peigang| | 2010-5-31 15:53 | 只看该作者
LZ这个程序是既接收上位机程序
也想向上位机发送程序吗

使用特权

评论回复
15
hawk20022002|  楼主 | 2010-5-31 16:19 | 只看该作者
是的

使用特权

评论回复
16
电子三极管| | 2010-5-31 17:19 | 只看该作者
学习

使用特权

评论回复
17
kingsut2006| | 2010-5-31 18:56 | 只看该作者
学习中 我也用过串口 我用gets(data_string2,5);接收串口调试助手的字符串 然后用printf("%s",data_string2);发送 发现发送一次"love " 串口却显示两个“love” 呵呵 还弄不清呢

使用特权

评论回复
18
一棵小草| | 2010-5-31 20:03 | 只看该作者
程序放上来,就不能现整理一下吗。


void init_serialcom( void ) //串口通信初始设定
{
       SCON = 0x50 ;          //UART为模式1,8位数据,允许接收
     TMOD |= 0x20 ;        //定时器1为模式2,8位自动重装
     PCON |= 0x80 ;        //SMOD=1;
                                        //    TH1 = 0xFA ;   //Baud:19200 fosc="11".0592MHz
        TH1=0XF4  ;            //9600    22.1184m
        IE |= 0x90 ;            //Enable Serial Interrupt
        TR1 = 1 ;                // timer 1 run
        TI=1;                     
//执行完这一句后,会马上进入中断函数,而你的中断函数没有让TI =0,所以就不断的中断,当然会乱码了。
}

在中断函数中清中断,再试试
void serial () interrupt 4 using 3
{
     if(TI ==1)TI =0;
      if(RI)
----------------

使用特权

评论回复
19
一棵小草| | 2010-5-31 20:10 | 只看该作者
本帖最后由 一棵小草 于 2010-5-31 20:13 编辑

while (TI== 0);
TI= 0 ;

对的

使用特权

评论回复
20
hawk20022002|  楼主 | 2010-5-31 20:28 | 只看该作者
我试了下。。运行几次就死掉了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

26

帖子

0

粉丝