野屲 2018-05-04 03:42 采纳率: 50%
浏览 932
已采纳

求大佬检查下我的代码为什么不能完成我想要的功能?关于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条回答 默认 最新

  • 褒河青石 2018-05-05 10:22
    关注
    1. 单片机1次接收和多次接收
      ReceiveString();
      if(Deal_UART_RecData())
      {
      flag=1;
      //在此接收到数据个数准确,为了下次接收,j=0;
      }
      RI=0; //清接受

      1. 既然有两个串口,将接收到数据发送到第二个串口,连接PC机,用串口助手查看
      2. 接收数据首先判断字节数准确,用LED亮灯显示;判断格式准确,闪烁显示是最简单的方法
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器