找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

代码高手看一下我的单片机代码有些问题但不知道问题在哪

查看数: 3186 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-6-21 20:51

正文摘要:

第一个算式正确第二个就在第一个的基础上累加,输入没有优先级 单片机源程序如下: #include<reg52.h> #include<stdio.h> #include <stdlib.h> void send_int_to_serial_port(int c); unsigned ...

回复

ID:1087948 发表于 2023-7-31 12:30
我注意到了几个可能的问题:  在 uart() 中断函数中,你在接收到数据后立即发送了相同的数据回去,这可能不是你想要的行为。  在 panduan_jisuan() 函数中,你的代码假设每个数字和运算符都是由单个字符表示的,且每个数字和运算符之间没有任何空格或其他字符。如果输入的表达式不满足这些条件,你的代码可能无法正确地解析和计算它。  同样在 panduan_jisuan() 函数中,你的代码只处理了第一个运算符和等号之后的字符,对于等号之后的字符,你的代码并没有进行处理。  你的代码没有处理除数为0的情况,如果输入的表达式包含除以0的操作,你的代码可能会产生错误。  在 main() 函数中,你使用了一个名为 flag 的变量来判断是否已经接收到数据,但是你并没有在任何地方初始化这个变量。如果这个变量的初始值不是0,你的代码可能会在接收到任何数据之前就开始尝试进行计算。
ID:1053359 发表于 2023-7-3 12:57
在您提供的代码中,存在以下问题:  chuankou_chushihua() 函数中缺少对串口引脚的配置。在8051单片机中,需要设置相应的引脚(如P3.0和P3.1)为串口通信功能。  在主函数 main() 中,调用 chuankou_chushihua() 函数时没有传入任何参数,但是函数定义中有一个参数。  在 uart() 中断函数中,nm 变量用于记录接收到的字符数量,但未进行初始化。需要在主函数中添加类似 nm = 0; 的语句。  在 panduan_jisuan() 函数中,判断数字范围的条件语句错误。正确的条件应为 '0' <= rec_data[i] && rec_data[i] <= '9'。此外,该条件语句也需要修正为 rec_data[i] 而不是 rec_data[0]。  在 panduan_jisuan() 函数中,返回值 ansi 应在最后的 switch 语句之后进行赋值,而不是在进入循环时
ID:844772 发表于 2023-7-3 08:01
1.累加的原因是没清零,但我觉得连续累加这也是一个功能吧。
2.没有优先级是程序问题,建议使用堆栈处理数据,同时解决只能一位运算的问题。
ID:1086796 发表于 2023-7-2 15:55
这个程序有几个问题:  在程序开头引入的头文件reg52.h是基于8051单片机的,而不是适用于大多数现代的开发平台。你可以考虑移除这个头文件。  头文件stdio.h中的printf函数和stdlib.h中的sprintf函数不能直接使用,因为它们是针对标准输入输出流的,而不是嵌入式系统中的串口通信。你需要自己实现串口发送函数和接收函数。  rec_data数组没有进行边界检查,可能导致越界访问。在处理接收到的数据之前,应该先检查接收到的数据长度是否超过了数组的长度。  没有对变量nm进行初始化,可能导致未定义的行为。在使用或判断nm之前,应该将其初始化为合适的值。  在函数panduan_jisuan中,判断数字是否在正确的范围内时,使用了错误的条件。应该是'0'<=rec_data[i]&&rec_data[i]<='9'而不是'0'<=rec_data[0]&&rec_data[0]<='9'。  在函数panduan_jisuan中,在执行完一个运算符后没有重置op的值,可能导致后续运算出错。在处理完一个运算符后,应该将op重置为空字符。  在函数send_int_to_serial_port中,没有定义变量i的类型和初始值。应该在函数开头定义并初始化变量i。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:1063563 发表于 2023-6-25 09:47
buffer缓冲区不够了,数据溢出了吧。
ID:1067540 发表于 2023-6-23 14:15
在计算结束后把存储计算结果的变量清零
ID:235200 发表于 2023-6-22 13:12
接收中断发生时,需一次把所有接收字符接收完(没有做到),
send_int_to_serial_port这个函数想把接收表达式及结果发送出去,可buffer缓冲区中无内容

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

Powered by 单片机教程网

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