4196|11

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口通信的问题 [复制链接]

我想让我的单片机发送一串命令去控制指纹模块,把单片机的串口接到PC上可以看到单片机正确的发送了一串命令到PC上,可是将其接口接到指纹模块上却没有任何反应,(指纹模块是ttl电平,我将单片机的RXD直接接到指纹的UART输出端,TXD接的UART输入端),波特率设置的也是一样的,不知道是什么原因就是不行。请各位大虾提出宝贵意见

最新回复

各位大虾你们好:我现在也遇到了和楼主一样的问题,希望大家能给小弟指导一下。不知楼主是怎么解决的这个问题,还望楼主赐教。谢谢大家啦 QQ:982643183  详情 回复 发表于 2010-3-12 10:08
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
地线连了没有,将指纹模块与PC连一下试试,看指纹模块是否工作正常。
 
 

回复

77

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
指纹模块是ttl电平,我将单片机的RXD直接接到指纹的UART输出端
///

你用你和PC连的方法,和指纹模块通信,应该就没问题了

而MCU 的RXD 直接接就不可以了
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

4
 
搞个示波器连上直接捉信号。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
指纹模块和PC可以正常的通信,单片机和指纹模块都通过了TTL转RS232和PC工作,指纹模块和单片机是可以直接相连通信的,但是不知道什么原因我的连上就是没有反应,请各位大侠说说自己的看法
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
1.rxd和txd线是否交叉?
2.地线是否连接?
3.是否同为ttl电平连接的?
4.程序有无问题?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 zxq6 的回复:
1.rxd和txd线是否交叉?
2.地线是否连接?
3.是否同为ttl电平连接的?
4.程序有无问题?


1.rxd和txd线是交叉了
2.地线也连了
3.同为TTL电平
4.要控制指纹模块是向它发送一串命令,因此我写了一串命令的程序如下:
unsigned char read_usernumber(void)         //读用户总数要发送命令为F5090000000009F5
        {
         unsigned char idata check,i;
                  
                TXBUF[0]= 0xF5;
                   TXBUF[1]= 0x09;   
                   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;   //判断接收到的第5位是否为0的标志
                   rev_ok= 1;       //操作是否成功标志
                   TX_len= 8;        //发送的长度为8位
                   RX_len= 8;        //接收的长度为8位
                  
                   SERIAL_TX_isr();
                   Tdelay_10ms(100);
               
           return(rev_ok);
  }  

void SERIAL_TX_isr (void)           发送命令
{
   unsigned char idata n;
  
          TOGGLE_WD();
   if(TX_len == 8)
     {       
              ES=0;         
      for(n=0;n<8;n++)
         {
                SBUF = TXBUF[n];
                 while(!TI);
                TI=0;
                }
             ES=1;
    }
  }


void SERIAL1_RX_isr (void) interrupt 4 using 3               
{                        
  unsigned char idata c,bcc;
       
        if(RI)                                                                           
    {                                                                                 
      c = SBUF;                                                                     
      RI=0;            
      oldState= State;
      State= 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 && RX_len==8)
                  {
                          RXBUF[7]= c;
                          rev_ok=0;            //操作成功          
                          
                   else
                 {
                         rev_ok= 1;
                  SBUF= rev_ok;
                   while(!TI);
                  TI=0;
                 }
               break;
                
            default: break;
          }
        }
if (TI && !RI)                                                                    
    {                                                                                                            
     TI= 0;                                                                        
          bcc=0;                                                                                                                                                                                       
    }                                                                                      
}       

当单片机接pc时可以看到从串口发出一串命令,当按照指纹模块的正确返回值发送给单片机时,可以证明是操作成功的,但是直接接到模块上就没有反应。在模块和pc上试的时候又是对的,真是不知道是哪里出了毛病,请各位大虾出出主意!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
先看看是发送问题还是接收问题。我看接收中断还是有些问题的。
    case 0:
   
      TIME_OUT=50;
      if (c== 0xF5)        //接收起始位
     
        {
        RXBUF[0]=c;
        State= 1;
        break;      
        }

这个break的位置就错了。其他问题没有仔细查。感觉程序的结构不是很好。
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

9
 

这的break是应该放到括号外面来吧?

发送应该是没有问题,在串口调试助手上可以看到单片机发送出来的一串正确的数,有点疑问就是,如果从串口调试器上发出来的一串数,数与数之间有多大的时间间隔呢?
在单片机与pc相连的时候,单片机可以接收pc的返回值反馈接收正确,不知道这能不能说明接收中断程序是对的呢?
有人还提出一种可能,就是我单片机的波特率在19200上有点偏差,指纹模块也是有点偏差,而他们的偏差又恰恰相反,可能会影响通信,请问这种说法有道理吗?我怎么调整这其中的偏差呢?
void init_serialcomm( void )
  {
                SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr  字串8
                TMOD = 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
                PCON = 0x80 ; //SMOD=1;
                TH1 = 0xFA;
                TL1 = 0XFA; //Baud:19200
                EA=1 ; //Enable Serial Interrupt
                ES=1;
                TR1 = 1 ;
  }
初始值稍微改变一个数就是另外一个波特率了,我该怎么调整偏差呢?
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

10
 
为什么都没人进来说说,哎
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 
各位大虾你们好:我现在也遇到了和楼主一样的问题,希望大家能给小弟指导一下。不知楼主是怎么解决的这个问题,还望楼主赐教。谢谢大家啦
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
各位大虾你们好:我现在也遇到了和楼主一样的问题,希望大家能给小弟指导一下。不知楼主是怎么解决的这个问题,还望楼主赐教。谢谢大家啦 QQ:982643183
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表