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

求大佬检查下我的代码为什么不能完成我想要的功能?关于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亮灯显示;判断格式准确,闪烁显示是最简单的方法
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • Rambo.Fan 2018-05-04 04:19

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

    评论
    解决 无用
    打赏 举报
  • Rambo.Fan 2018-05-04 04:21

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

    评论
    解决 无用
    打赏 举报
  • 白色一大坨 2018-05-04 04:24

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题