找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1630|回复: 6
收起左侧

新手疑惑 关于C51单片机串口通讯的问题,挺急的在线等

[复制链接]
ID:379876 发表于 2018-7-31 23:08 | 显示全部楼层 |阅读模式
50黑币
各位好,本人由于刚刚接触51单片机,在学习串口通讯中遇到了困难,

{~}]@@8K`T7{0QJAWV]A8{8.png

问题是:
由串口助手输入字符串后,再返回到串口助手上的字符串却有丢失,丢失的特点为,间隔丢失。
自己的理解:
函数中有比较函数 strstr(),输入ready后,可以继续运行(led会灭)
所以rec数组所存的是输入串口助手中的字符串,但显示出来却是“ray”,
应该是send_str()函数有问题,但找不出原因。

请求老手指点!不胜感激!!
由于是新手,如果能够解释得清楚一些就更好了!
下面是我的源码:
  1. #include "reg52.h"
  2. #include   <string.h>
  3. #include   <stdio.h>
  4. #include   <stdlib.h>
  5. #include   <intrins.h>

  6. typedef unsigned char u8;
  7. typedef unsigned int u16;

  8. sbit LED=P2^0;

  9. u8 rec_ct=0;                        //记录接收数据的位数
  10. u8 rec_flag=0;                        //接收完成标志
  11. u8 rec[10];                                //定义一个数组

  12. void delay3s(void)      //延时3s,误差 0us
  13. {
  14.     unsigned char a,b,c;
  15.     for(c=254;c>0;c--)
  16.         for(b=96;b>0;b--)
  17.             for(a=60;a>0;a--);
  18.     _nop_();  //if Keil,require use intrins.h
  19. }

  20. void delay500ms(void)   //延时0.5s,误差 0us
  21. {
  22.     unsigned char a,b,c;
  23.     for(c=205;c>0;c--)
  24.         for(b=116;b>0;b--)
  25.             for(a=9;a>0;a--);
  26. }



  27. void UsartInit()                //串口初始化
  28. {
  29. SCON=0x50;                        //串口设置
  30. TMOD=0X20;                        //T1计数器设置
  31. PCON=0x80;                        //倍增打开
  32. TH1=0xf3;
  33. TL1=0xf3;                        //波特率设为4800;
  34. EA=1;                                //IE设置
  35. ES=1;
  36. TR1=1;                                //开始计数
  37. }


  38. void send_str()                        //发送接收到的字符串
  39. {
  40. u8 i;
  41. for(i=0;i<10;i++)
  42. {
  43.   SBUF=rec[i];
  44.   while(!TI);
  45.   TI=0;
  46.   i++;
  47. }
  48. }



  49. void Ustar() interrupt 4
  50. {
  51. if(RI==1)
  52. {
  53.   RI=0;
  54.   rec[rec_ct]=SBUF;                        //接收串口数据
  55.   rec_ct++;
  56.   if(rec_ct==10) rec_ct=0;        //防止溢出
  57.   rec_flag = 1;
  58. }
  59. }


  60. void main()
  61. {
  62. u8 ct;
  63. UsartInit();

  64. start:

  65.          ct = 0;
  66.         while(1)
  67.         {        
  68.                 LED=0;                              //这个灯作为指示灯
  69.                 delay3s();                          //等待3S
  70.                 if(rec_flag == 1)                   //串口接收到数据
  71.                 {
  72.             rec_flag = 0;
  73.                         send_str();                                                //发送接收到的字符串
  74.                         if(strstr(rec, "ready"))        //有没有ready
  75.                         {
  76.                                 P2 = 0xff;                   //接收到正确的回复就灭
  77.                                 delay500ms();
  78.                                 break;
  79.                         }
  80.         }
  81.                 ct ++;
  82.                 if(ct>=3) goto start;               //超过三次重新开始     
  83.   }
  84.   while(1);
  85. }



复制代码




最佳答案

查看完整内容

你的send_str函数里面已经在for循环里将i++了,然后你TI = 0;后依然i++。检查一下。 void send_str(void) //发送接收到的字符串 { u8 i; for(i=0; i
回复

使用道具 举报

ID:221865 发表于 2018-7-31 23:08 | 显示全部楼层
你的send_str函数里面已经在for循环里将i++了,然后你TI = 0;后依然i++。检查一下。
void send_str(void)                        //发送接收到的字符串
{
    u8 i;
    for(i=0; i<10; i++)
    {
        TI = 0;
        SBUF=rec[i];
        while(!TI);
        TI = 0;
    }
}
回复

使用道具 举报

ID:375003 发表于 2018-8-1 01:21 | 显示全部楼层
把发送也要写到中断里,不能这样写
回复

使用道具 举报

ID:375003 发表于 2018-8-1 01:22 | 显示全部楼层
象这样写.
void intSIO() interrupt 4 using 2
{
if(TI){
  TI=OFF;
  if(bSD){
   if(curSND<lenSND) SBUF=bufSND[curSND++];
   else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
  RI=OFF;
  bufRCV[putRCV++]=SBUF;
  putRCV &= 0X07;}
}
回复

使用道具 举报

ID:379876 发表于 2018-8-1 07:38 | 显示全部楼层
那请问将发送写入中断后,如何触发TI=1的条件呢?如果不能触发TI=1就不能将数据写入SBUF,而数据没有写入SBUF,就无法触发TI=1的条件,这是个死循环啊。。。。。。 我的理解是这样的
回复

使用道具 举报

ID:381546 发表于 2018-8-1 09:39 | 显示全部楼层
void intSIO() interrupt 4 using 2
{
    if(TI)
    {
        TI=OFF;
        if(bSD)
        {
        if(curSND<lenSND) SBUF=bufSND[curSND++];
       else {bSD=OFF;/*mSI=0;*/}}}
      if(RI){
         RI=OFF;
          bufRCV[putRCV++]=SBUF;
            putRCV &= 0X07;}
}
回复

使用道具 举报

ID:379876 发表于 2018-8-2 08:21 | 显示全部楼层
谢谢各位前辈给我的建议和热心的解答!但是我的问题是为什么会出现这样的情况以及解决方法,最佳答案只能给解决了这两个问题的人哈。大家对我编程的建议我都应用在后续程序中了,使得逻辑更加清晰了,非常感谢!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表