• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

51串口通信

15003171706 2018-12-03 浏览量:790

想问一下,51串口通信时为何会吃掉一个数据?

就是写一个密码锁时,第一次输入密码1234时,单片机会吃掉数字“4”

第二次发送则正常​

IMG_20181126_220758.jpg


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 绝对的程序问题。建议找一份正确的串口程序仔细研读一下,或者我也能提供程序。
    • 发布于 2018-12-03
    • 举报
    • 评论 0
    • 3
    • 0

其他答案 数量:13
  • 无代码无真相

    提出这种问题一定要把相关代码展示给大家

    • 发布于2018-12-03
    • 举报
    • 评论 0
    • 1
    • 0

  • 绝对的程序问题。建议找一份正确的串口程序仔细研读一下,或者我也能提供程序。
    • 发布于2018-12-03
    • 举报
    • 评论 0
    • 1
    • 0

  • 一定是程序上的BUG了,可以仿真一下,看看第一次时收到的数据是什么啊,是不是缓存的偏移没有清0
    • 发布于2018-12-03
    • 举报
    • 评论 0
    • 1
    • 0

  • 具体看程序是出现在数据缓冲刷新了还是寄存器溢出!
    • 发布于2018-12-03
    • 举报
    • 评论 0
    • 1
    • 0

  • 这种可能性比较大的就是程序的问题。验证方式可以用示波器看下引脚上是否发出了1234实际的4个数据。
    • 发布于2018-12-04
    • 举报
    • 评论 0
    • 1
    • 0

  • 这个没有具体的程序不好分析。
    • 发布于2018-12-03
    • 举报
    • 评论 0
    • 0
    • 0

  • 百分百程序问题,没等待发送完成就发送下一位,需要等待ti寄存器置位在继续发送
    • 发布于2018-12-03
    • 举报
    • 评论 0
    • 0
    • 0

  • 我能补个程序吗?

    //**********************************************
    就是这个程序,有问题
    //*******************************************​

    #include<reg52.h>
    #include<intrins.h>
    
    typedef unsigned int uint;
    typedef unsigned char uchar;
    uchar R_data;
    bit R_flag = 0;
    uchar code f[] = "error";
    uchar code t[] = "true";
    uchar code st[] = "Please input your key:";
    uchar code st2[] = "The key is:";
    uchar code st3[] = "请输入密码以解锁:  \n";
    char key[10]={"******"};///  \0\0\0\0\0
    char *p*l;
    uchar j=0i = 0n=0;
    
    int delay(unsigned int a) {
    
    
    	while (a--);
    
    	return 0;
    }
    
    void Start()
    {
    	TMOD = 0x20;   //定时器工作在定时器1的方式2
    	PCON = 0x00;   //不倍频
    	SCON = 0x50;	//串口工作在方式1,并且启动串行接收	
    	TH1 = 0xfd;    //设置波特率 9600
    	TL1 = 0xfd;		//模式2 8位自动刷新   TL1 = TH1		
    	TR1 = 1;		//启动定时器1
    	EA = 1;		//开总中断	
    	ES = 1;		//开串口中断
    	
    }
    
    //发送
    void send_out(int a)
    {
    	switch (a)
    	{
    	case 1:
    		p = st;
    		while (1)
    		{
    
    			SBUF = *p;
    			while (!TI)
    			{
    				_nop_();
    			}
    			p++;
    			if (*p == '\0') break;
    			TI = 0;
    			
    		}
    
    		break;
    
    	case 2:
    
    
    		p = st2;
    		while (1)
    		{
    
    			SBUF = *p;
    			while (!TI)
    			{
    				_nop_();
    			}
    			p++;
    			if (*p == '\0') break;
    			TI = 0;
    
    		}
    
    		p = key;
    		while (1)
    		{
    
    			SBUF = *p;
    			while (!TI)
    			{
    				_nop_();
    			}
    			p++;
    			if (*p == '\0') break;
    			TI = 0;
    
    		}
    	}	
    }
    
    //接受中断
    void Start1(void) interrupt 4
    {
    	
    	EA = 0;
    	if (RI == 1)   //当硬件接收到一个数据时,RI会置位
    	{
    
    		
    		key[j] = SBUF;
    		j++;
    		
    		
    		RI = 0;
    		R_flag = 1;
    		i = 0;
    	
    	}
    	EA = 1;
    	
    }
    
    void main()
    {
    
    	Start();
    	j = 0;
    	send_out(1);
    	i = 1;
    	while (i);
    
    
    	while (1)
    	{
    			  j=0;
    			if (R_flag == 1)
    			{
    				
    				send_out(2);
    				R_flag = 0;
    			}
    			
    		
    	}
    }

    • 发布于2018-12-03
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个还是要从程序着手了,本身硬件通讯是正常的。
    • 发布于2018-12-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 仔细排查下程序,可以先抄一个正常的程序看看,可以用示波器看看数据发送的完整性。
    • 发布于2018-12-04
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个就跟你的软件有关了,可以调试一下,第一次只发一个字节,看能否收到
    • 发布于2018-12-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 一般都是要检查你的软件,检查你的软件是否正常
    • 发布于2019-01-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个主要是排查你的软件,用单步调试看一下数据找问题
    • 发布于2019-01-14
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

51串口通信