打印

单片机和dsp串口通信问题

[复制链接]
3262|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuelian922|  楼主 | 2008-10-29 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以单片机为主机向DSP模块发送命令,DSP模块根据接收的命令执行操作。
单片机和PC连接时从串口调试助手上可看到主机发出的命令是对的,波特率为19200;
PC为主机给dsp发命令的时候,DSP模块会执行相应的操作,波特率也为19200。但不知道什么原因,单片机和dsp相通信的时候dsp就没有任何的反应。请高手帮忙分析分析

相关帖子

沙发
hotpower| | 2008-10-29 21:27 | 只看该作者

线反了???

使用特权

评论回复
板凳
xuelian922|  楼主 | 2008-10-30 11:56 | 只看该作者

接线确定没反

有人说可能是波特率有偏差的原因,即DSP的和单片机的波特率可能朝19200的左右两个方向偏差可能导致不能通信,但是我觉得波特率偏差是在数据量传输大的情况下会出错,我只发8个字节的命令给DSP为什么也不能通信呢?大虾说说会是波特率偏差的原因不?

使用特权

评论回复
地板
chen3bing| | 2008-10-30 14:29 | 只看该作者

应该不是

我用dsp和st7单片机做通讯时没出现这个现象。

使用特权

评论回复
5
xuelian922|  楼主 | 2008-10-30 16:39 | 只看该作者

那可能是什么原因引起的呢?

 刚毕业,第一次做项目,请各位前辈多多指教啊!
 谢谢先!

使用特权

评论回复
6
sodwell| | 2008-10-30 17:00 | 只看该作者

re

可能是波特率偏差引起的,比如2个的晶震影响到波特率的误差范围,2个都有误差,那通讯起来误差就更大了,比如做串口接GPRS时,如果波特率误差较大,就可能连接失败。但是这个可能性不大,最好还是仔细检查软件,是不是逻辑错误。硬件连线先检查一下,通讯的时候用示波器观察一下,看下波形

使用特权

评论回复
7
xuelian922|  楼主 | 2008-10-30 17:42 | 只看该作者

程序发送命令部分写的很简单

unsigned char del_alluser(void)     //删除所有用户函数,里面写好了
{                                        //MCU要发给DSP的8个字节的数
    unsigned char idata check,i;
    
    TXBUF[0]= 0xF5;
    TXBUF[1]= 0x05;        //cmd=0x05
    TXBUF[2]= 0x00;
    TXBUF[3]= 0x00;
    TXBUF[4]= 0x00;
    TXBUF[5]= 0x00;
    
    check = TXBUF[1];
  for(i=2;i<6;i++)
      {
          check^= TXBUF;        
         }
      TXBUF[6] = check;
      TXBUF[7] = 0xF5;    
      
    rev_bit5= 0;
  rev_ok= 1;
     rev_len= 0;
         
    SERIAL_TX_isr();
  Tdelay_10ms(100);
        
     return(rev_ok);
}


void SERIAL_TX_isr (void)    //发送数据
 {
   unsigned char idata n;
  
      TOGGLE_WD();
          ES=0;
      for(n=0;n<8;n++)
         {         
             TOGGLE_WD();
            SBUF = TXBUF[n];
             while(!TI);
            TI=0;
            delay_50us(10);
            }
     ES=1;
  }

和pc相连的时候可以从串口调试助手上看到发送出来的数据是对的,请大家看看我这段代码有错误吗?

更头痛的是公司的唯一一台示波器坏了没法用,我该怎么着手想办法?

使用特权

评论回复
8
xuelian922|  楼主 | 2008-10-31 13:00 | 只看该作者

有新发现

我的单片机板子上有MAX232芯片,DSP和MCU都是以能和PC串口正常工作的形式相连接,上电当我把RXD,TXD俩个直接相连时,MCU可以控制DSP,但是DSP的返回值不知道怎么回事没有接收正确,可能是接收函数有点不对,但是和pc通信的时候又可以。
还有我上面的这种接法有问题吗?时好时坏,有时候能控制,有时候又不行

在此贴出接收8个字节的接收程序请高手帮忙看下有什么错误把,谢谢
void SERIAL_RX_isr (void) interrupt 4 using 3     
{             
  unsigned char idata c,bcc,i;
    if(RI)
   { 
         RI=0;
      c = SBUF;    
      oldState= State;
       State= 0;
     if(rev_len==0)
    {
       switch (oldState)
       {
             case 0:
    
      TIME_OUT=50;
      if (c== 0xF5)        //接收起始位
        {
        RXBUF[0]=c;
        State= 1;
        } 
      break;
    case 1:

      TIME_OUT= 50;
      if (c == TXBUF[1])
      
        { 
        RXBUF[1]= c;
        bcc= c;
        State= 2;
        }
      else
        {
        rev_ok= 1;
        State= 15;
        }    //  接收到的命令字不同,操作失败
        
        break;
        
    case 2:
      
        TIME_OUT= 50;
        RXBUF[2]= c;
        bcc^= c;
        State= 3;
      break;

    case 3:
        
        TIME_OUT= 50;
        RXBUF[3]= c;
        bcc^= c;
        State= 4;
    break;
        
    case 4:

        TIME_OUT= 50;
        if (rev_bit5== 0)      //返回值为操作成功与否的时候
        { 
          if (c==0)
          { RXBUF[4]= c;        //操作成功返回0
              bcc^= c;
              State= 5;
        break;
          }
          else
          {
            rev_ok= 1;              //操作失败
          State= 15;
          }
        }
      else
      {
        if (c==1||c==2||c==3)        //返回值位用户权限
         {
          RXBUF[4]= c;
          bcc^= c;
          State= 5;
          break;
         }

        else
          {
          rev_ok= 1;              //操作失败 返回状态为15
          State= 15;
         }
      }
      break;
    case 5:
      
      TIME_OUT= 50;
      RXBUF[5]= c;
      bcc^= c;
      State= 6;
      break;
      
    case 6:
        
        TIME_OUT= 50;
        if (c==bcc)
        {
        RXBUF[6]= c;
        State=7;
        }
        else
        {
        rev_ok= 1;
        State=15;
        }
        break;
      case 7:
        
        TIME_OUT= 50;
        if(c==0xF5)
          {
          RXBUF[7]= c;
          rev_ok=0;            //操作成功
         }
       else
        {
        rev_ok= 1;
        }
      break;
      default: break;
 }
}

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝