野屲 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 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler