不知道程序那些地方有问题,不考虑算式优先级,发送顺式计算结果返回给串口,但是不知道为什么发送的是乱码
单片机源程序如下:
#include<reg52.h>
#include<stdio.h>
unsigned char rec_data[32];
unsigned char op,flag, num[2],n=0;
unsigned int i,j,ansi=0,nm;
void delay_ms(int a)
{
int b,d;
for(b=a;b>0;b--)
for(d=0;d<114;d--);
}
void chuankou_chushihua()//串口初始化程序
{
TMOD|=0X20; //设置计数器1为工作方式 2
SCON=0X50; //设置串行口为工作方式 1
PCON=0X80; //波特率加倍
TH1=0XFA; //计数器初始值设置9600baud
TL1=0XFA;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void uart() interrupt 4 //串口通信中断函数
{
RI = 0; //清除接收中断标志位
rec_data[nm]=SBUF; //存储接收到的数据
nm++;
flag=1;//设立标识位
}
void send_data( unsigned char jieguo)
{
SBUF=jieguo;
while(!TI);
TI=0;
}
void panduan_jisuan()
{
if('0'<=rec_data[0]&&rec_data[0]<='9')
{// 将第一个数字存入num[0]
num[0] = rec_data[0] - '0';
// 扫描整个字符数组,从第二个字符开始逐一处理
for (i = 1; i < nm; i++)
{
// 如果是运算符,则将其存储到op中,并将下一个数字存入num[1]
if (rec_data[ i] == '+' || rec_data[ i] == '-' || rec_data[ i] == '*' ||rec_data[ i] == '/')
{
op = rec_data[ i];
num[1] = rec_data[i + 1] - '0';
// 将指针移位至下一个数字
}
// 如果是等号,则运算结果即为第一个数字
else if (rec_data[ i] == '=')
{
ansi = num[0];
}
// 如果是数字,则根据之前的运算符进行运算
else if('0'<=rec_data[0]&&rec_data[0]<='9')
{
switch (op)
{
case '+':
num[0] = num[0] + (rec_data[ i] - '0');
break;
case '-':
num[0] = num[0] - (rec_data[ i] - '0');
break;
case '*':
num[0] = num[0] * (rec_data[ i] - '0');
break;
case '/':
num[0] = num[0] / (rec_data[ i] - '0');
break;
}
ansi=num[0];
}
}
}
}
void send_int_to_serial_port(int c)
{
char buffer[16];
// 使用 sprintf() 函数将整型变量转换为字符串
sprintf(buffer, "%d", c);
// 将字符串逐个发送到串口
for (i = 0; buffer[ i] != '\0'; i++)
{
send_data(buffer[ i]);
}
}
void main()
{
chuankou_chushihua( );
while(1)
{
if(flag==1)
{
panduan_jisuan();
send_int_to_serial_port(ansi);
}
flag=0;
}
}
|