找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1304|回复: 10
打印 上一主题 下一主题
收起左侧

串口计算器程序,电脑向单片机发送顺序计算式1*2+3=不知道为什么在串口接收过来乱码

[复制链接]
跳转到指定楼层
楼主
ID:435640 发表于 2023-6-20 18:32 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
150黑币
不知道程序那些地方有问题,不考虑算式优先级,发送顺式计算结果返回给串口,但是不知道为什么发送的是乱码
单片机源程序如下:
#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;                 
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:435640 发表于 2023-6-21 11:44 | 显示全部楼层
lkc8210 发表于 2023-6-21 11:24
1. flag不可以在每次进中断都赋值,应改为串口超时后赋值
2. 如果TI不在中断里清零,要在SBUF=。。。之前 ...

能否给改一下,串口第一次用
回复

使用道具 举报

板凳
ID:435640 发表于 2023-6-21 16:19 | 显示全部楼层
oldhawk 发表于 2023-6-21 14:46
这个首先要排除波特率误差问题,其次才是报文等,因为串口通讯比较简单

现在没有乱码只是计算结果为零
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表