我注意到了几个可能的问题: 在 uart() 中断函数中,你在接收到数据后立即发送了相同的数据回去,这可能不是你想要的行为。 在 panduan_jisuan() 函数中,你的代码假设每个数字和运算符都是由单个字符表示的,且每个数字和运算符之间没有任何空格或其他字符。如果输入的表达式不满足这些条件,你的代码可能无法正确地解析和计算它。 同样在 panduan_jisuan() 函数中,你的代码只处理了第一个运算符和等号之后的字符,对于等号之后的字符,你的代码并没有进行处理。 你的代码没有处理除数为0的情况,如果输入的表达式包含除以0的操作,你的代码可能会产生错误。 在 main() 函数中,你使用了一个名为 flag 的变量来判断是否已经接收到数据,但是你并没有在任何地方初始化这个变量。如果这个变量的初始值不是0,你的代码可能会在接收到任何数据之前就开始尝试进行计算。 |
在您提供的代码中,存在以下问题: 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 语句之后进行赋值,而不是在进入循环时 |
1.累加的原因是没清零,但我觉得连续累加这也是一个功能吧。 2.没有优先级是程序问题,建议使用堆栈处理数据,同时解决只能一位运算的问题。 |
这个程序有几个问题: 在程序开头引入的头文件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。 |
buffer缓冲区不够了,数据溢出了吧。 |
在计算结束后把存储计算结果的变量清零 |
接收中断发生时,需一次把所有接收字符接收完(没有做到), send_int_to_serial_port这个函数想把接收表达式及结果发送出去,可buffer缓冲区中无内容 |