发新帖我要提问
123
返回列表
打印

请问怎么来判断串口在发送数据

[复制链接]
楼主: jack.king
手机看帖
扫描二维码
随时随地手机跟帖
41
dreambird| | 2007-9-11 20:11 | 只看该作者 回帖奖励 |倒序浏览

是有点慢,一个星期了

使用特权

评论回复
42
jack.king|  楼主 | 2007-9-12 16:06 | 只看该作者

写到是写出来了很久,只是想优化下.

谢谢各位前辈的指导!
  小弟我把程序贴出来.希望各位指出错误和改进方法!
   谢谢了.
/*协议如下
  采用相同的波特率,双方约定,发送时,先发送一个呼叫信号(0x06)
  以询问接受机是否可以接受数据,接受机收到呼叫信号后,若同意接受数据则回
  发0x00作为答应信号,表示可以接受数据,否则回发0x05,表示暂不能接受数据
  发送机只有在接收到接收机发回的答应信号0x00后才能将数据统一发送到接收机,
  否则不断想接收机发送呼叫信号,直到接收到接收机发回的0x00的应答信号.
  若接受正确,向发送机回发0x0f信号,表示正确,否则发送0xf0,表示接受到的数据出现了错误
*/
发送程序如下:
/**********************************************************************************/
void tx_add(void)
{      
  uchar total_t=0x00;//累加和计数器
   while(1)
   {
   while(1)
   {
   ACC=0x06;//发送呼叫信号06
   SBUF=ACC;
     while(1)    //等待发送完信号.  
        {
      if(TI)
          {    
          TI=0;
       break;
          }
        } 
       while(1)    //等待回答信号.  
        {
      if(RI)
          {    
          RI=0;
       break;
          }
        }
        ACC=SBUF;
        if(ACC==0x00)
        break;
        else
        ;
   }
        ACC=0x06;
        SBUF=ACC;
        while(1)     //等待发完
        {
        if(TI)
        {
        TI=0;
        break;
        }
        }
           i=1;
        while(1)         //开始发送数据
        {
             switch(i)
        {
         case 0x01:temp_f=t1;
         break;
         case 0x02:temp_f=t2;
         break;
         case 0x03:temp_f=t3;
         break;
         case 0x04:temp_f=t4;
         break;
         case 0x05:temp_f=t5;
         break;
         case 0x06:temp_f=t6;
         break;
        }
         ACC=temp_f;
        SBUF=ACC;
       while(1)    //等待发送完信号.  
        {
      if(TI)
          {    
          TI=0;
       break;
          }
        } 
        total_t=(ACC+total_t); //求累加和
        i++;
        if(i==7)
        break;
        }
        ACC=total_t;
        SBUF=ACC;//发送累加和
        while(1)
        {
        if(TI)
        {
        TI=0;
        break;
        }
        }
        while(1)  //等待回答
        {
        if(RI)
        {
        RI=0;
        break;
        }
        TI=0;
        }
        ACC=SBUF;
        if(ACC==0x0f)//发送正确
        RI=0;
        else
        ;
        break;

     }


}
下面是接受程序:想问下若改成中断接受则需要怎么改下啊?
/*****************************************************************/
void jieshou(void)
{    uchar total_t;
   while(1)
   {
    while(1)       //等待信号!
    {
     while(1)
     {
      if(RI)
        {    
       RI=0;
       break;
         }
     }
     ACC=SBUF;
     if(ACC==0x06)   //允许接受表示不忙
     break;
     else
     {
     ACC==0x05;
     SBUF=ACC;
     TI=0;//不允许接受
     }
     }
     ACC=0x00;
     SBUF=ACC;
     TI=0;
     while(1)
     {
     if(RI)
     {
     RI=0;
     break;
     }
     }
     total_t=SBUF; //累加和计数器
     j=1;
             while(1)         //开始接受数据
        {
           while(1)    //等待接受完信号.  
        {
      if(RI)
        {    
       RI=0;
       break;
         }
        } 
       ACC=SBUF;
       SBUF1=ACC;
       switch(j)
       {
        case 0x01:   temp8=SBUF1;
        break;
        case 0x02:   temp7=SBUF1;
        break;
        case 0x03:   temp6=SBUF1;
        break;
        case 0x04:   temp5=SBUF1;
        break;
        case 0x05:   temp4=SBUF1;
        break;
        case 0x06:   temp3=SBUF1;
        break;
       }
       total_t=(total_t+SBUF1);//求累加和
        j++;
        if(j==7)
       break;
        }
        while(1)  //等待接受校正
        {
         if(RI)
         {
          RI=0;
          break;
         }
        }
        ACC=SBUF;
        if(ACC==total_t)
        {
        ACC=0x0f;        //发送正确
        SBUF=ACC;
        while(1)
        {
        if(TI)
        {
        TI=0;
        break;
        }
        }
        }
        else              //发送错误
        {
        ACC=0xf0;
        SBUF=ACC;
        while(1)
        {
        if(TI)
        {
        TI=0;
        break;
        }
        }
        }
        break;

   }
}

使用特权

评论回复
43
jack.king|  楼主 | 2007-9-16 00:07 | 只看该作者

好几天没有看这个了.今天发现了错误

  上面所说的改成中断后没有效果的原因是因为ES没有打开.
    说明并且不能一直打开否则会出现一闪一闪的感觉
    呵呵!
   还是采用中断接受和查询发送的方式比较好!哈哈
   对了想问给提外话:
    用什么方法来克服:测温系统中的零飘啊!
   这个测量温度的系统是在工业控制之上的!

使用特权

评论回复
44
gyt| | 2007-9-16 09:18 | 只看该作者

33楼那个数据算错了吧

使用特权

评论回复
45
jack.king|  楼主 | 2007-9-16 14:08 | 只看该作者

TO:gyt



   现在我没有用T2计数来产生波特率
   因为开始用了.但是错误了
    望您赐教!
  谢谢

使用特权

评论回复
46
nyz440| | 2007-9-16 19:39 | 只看该作者

搞个LED显示下就好了

搞个LED显示下就好了 
要不弄个串口测试软件也好
到处都有下 
手动发送数据测试

使用特权

评论回复
47
gyt| | 2007-9-16 23:06 | 只看该作者

T2的计算公式是不一样的

不会是F3F3这样,你查一下书,一定能做对。

使用特权

评论回复
48
后学| | 2007-9-17 08:05 | 只看该作者

re

把Txd脚撬起来用示波器量,

使用特权

评论回复
49
hzcook| | 2007-9-19 09:42 | 只看该作者

用示波器才是王道

使用特权

评论回复
50
jack.king|  楼主 | 2007-9-19 17:05 | 只看该作者

谢谢各位!告诉的方法!

谢谢各位告诉的方法!我一直都是这么实验的!

使用特权

评论回复
51
rightnow10| | 2007-9-19 19:40 | 只看该作者

示波器

用示波器观察,一目了然。

使用特权

评论回复
52
西安周公| | 2007-9-20 15:24 | 只看该作者

当你连续发送55H的时候可以看见0101010101。

使用特权

评论回复
53
bg6nw| | 2007-9-20 20:19 | 只看该作者

收发是交叉连接的

LZ在26楼说道:是不是直接把TXD和RXD对接.让后也同时接地就可以了吧?

好像是说把两个单片机的T和R分别对接,正确的方法应该是交叉连接的,T对R,R对T,怎么没有人给他提个醒呀

使用特权

评论回复
54
jack.king|  楼主 | 2007-9-20 22:36 | 只看该作者

to:bg6nw

 谢谢你提出来!
    其实我说跟就是你的哪个意思.只是没有表达好!若你看了我开始上传的图就知道有点不同!
    谢谢各位告诉我的方法,我是用示波器测量的!   
    前几天我还发现一个有趣的事情.我在用示波器测量的时候.以为找不到错误.
     当我把RXD脚接了下地就发送正确的,不知道怎么是这样.!
      哈哈!

使用特权

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

本版积分规则