欲完成的功能:
我想要用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;
}
}