求大佬检查下我的代码为什么不能完成我想要的功能?关于51单片机C语言串口通讯方面的。

欲完成的功能:

我想要用pc的串口通讯助手给单片机发送xyz坐标,并将xyz坐标分别存到xm,ym,zm三个字符串数组中,然后用串口发送字符串函数将xm,ym,zm这三个数组再发送给串口通讯助手显示其值。
以下是这部分的代码:

#include <stc15f2k60s2.h>
#define FOSC 12000000       //设置晶振
#define BAUD 9600          //设定的波特率
char buf_string[13];  //定义数据包长度为13个字符
unsigned char flag=0;
unsigned char busy;
unsigned char tag;
unsigned char i,j=0,k=0,a,b,c;      
void UART_Init(void)  //初始化
{
    SCON=0x50;                      //8位UART    波特率可变      允许接受
    T2L=(65536-(FOSC/4/BAUD));      //设置装载值
    T2H=(65536-(FOSC/4/BAUD))>>8;

    AUXR =0x14;                     //T2为1T模式,并启动定时器2
    AUXR |=0x01;                    //选择定时器2为串口1的波特率发生器
    ES =1;                          //使能串口中断
    EA =1;                          //开启总中断                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
}
void UART_Sendchar(unsigned char dat)  //串口发送函数
{
        while(busy);
        busy=1;
        SBUF=dat;         
}
void UART_SendString(unsigned char *s)    //串口字符串发送
{
    while(*s)
    {
        UART_Sendchar(*s++);    
    }                 
}  
## /*之前的代码应该没问题,在此之后之后是我认为有可能出问题的字段*/
void ReceiveString()   //串口字符串接收函数 
{
    if(j<13)   //将输入坐标总字数规定在13位以内,且接受格式规定为(X,Y,Z),最大可输入的位数为13位,例如(-99,-99,-99)。
    {
      buf_string[j]=SBUF;
      if(buf_string[j]==',' && a==0) a=j;//记录下第一个逗号
      if(buf_string[j]==',' && a!=j) b=j;//记录下第二个逗号
      if(buf_string[j]==')') c=j;   //记录下右括弧,也就是数据的最后一位
      j++;       
    }
}
bit Deal_UART_RecData()   //处理串口接收数据包函数(成功处理数据包则返回1,否则返回0)
{
    buf_string[c+1]='\0'; //让接受到的")"的之后一位清零
    if(buf_string[0]=='(' && buf_string[c]==')' && buf_string[a]==',' && buf_string[b]==',')  //进行数据格式验证
    {        
     return 0;
    }
    return 1;
}
//--------------主函数---------------
void main()
{
    char xm[4];
    char ym[4];
    char zm[4];
      UART_Init();
    UART_SendString("开始!");
    while(1)
    {
    if(flag==1)
        {
          for(i=1;i<a;i++)
          {
            xm[k]=buf_string[i];
            k++;    
          }
          xm[k]='\0';
          k=0;
          for(i=a+1;i<b;i++)
          {
            ym[k]=buf_string[i];
            k++;
          }
          ym[k]='\0';
          k=0;
          for(i=b+1;i<c;i++)
          {
            zm[k]=buf_string[i];
            k++;
          }
          zm[k]='\0';
          k=0;
       UART_SendString("\r\nX坐标是\r\n ");UART_SendString(xm);
       UART_SendString("\r\nY坐标是\r\n ");UART_SendString(ym);
       UART_SendString("\r\nZ坐标是\r\n ");UART_SendString(zm);
       a=b=c=j=0;
       flag=0;
      }
    while(!flag);
   }
}
//------------------------------串口中断-------------------------------
void USART() interrupt 4   //标志位TI和RI需要手动复位,TI和RI置位共用一个中断入口
{
         if(RI)            //接受标志位
         {
               ReceiveString();
               if(Deal_UART_RecData())
                {
                  flag=1;
                }
               RI=0;       //清接受         
         }
         if(TI)             //发送标志位
         {
               TI=0;            //清发送标志位
               busy=0;
         }
}

请哪位大佬帮忙看看我哪出问题了?

4个回答

  1. 单片机1次接收和多次接收
    ReceiveString();
    if(Deal_UART_RecData())
    {
    flag=1;
    //在此接收到数据个数准确,为了下次接收,j=0;
    }
    RI=0; //清接受

    1. 既然有两个串口,将接收到数据发送到第二个串口,连接PC机,用串口助手查看
    2. 接收数据首先判断字节数准确,用LED亮灯显示;判断格式准确,闪烁显示是最简单的方法
qq_36341912
野屲 还需要把bit Deal_UART_RecData()这个函数里的return0,和return1调换过来
接近 2 年之前 回复
qq_36341912
野屲 只是我不明白为什么
接近 2 年之前 回复
qq_36341912
野屲 谢谢你的解答,这个错误我昨天自己修复了,将这句话去掉就好了“buf_string[c+1]='\0'; //让接受到的")"的之后一位清零”
接近 2 年之前 回复

你是学机械设计制造及其自动化?为啥不用汇编

另外附上环境和报错信息,你这啥都没有,不好定位问题。

qq_36341912
野屲 还需要把bit Deal_UART_RecData()这个函数里的return0,和return1调换过来
接近 2 年之前 回复
qq_36341912
野屲 “buf_string[c+1]='\0'; //让接受到的")"的之后一位清零”这句话有问题,我把这句话注释掉就好了,虽然我也不懂为啥。
接近 2 年之前 回复
qq_36341912
野屲 你好,这个错误我昨天已经自己修复了,这个程序是没有报错的,是逻辑问题
接近 2 年之前 回复

写和读的接口在哪里啊,还是你们单片机编程比较高级我看不懂呢?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问