![]() |
發(fā)布時間: 2023-6-21 20:51
正文摘要:第一個算式正確第二個就在第一個的基礎(chǔ)上累加,輸入沒有優(yōu)先級 單片機源程序如下: #include<reg52.h> #include<stdio.h> #include <stdlib.h> void send_int_to_serial_port(int c); unsigned ... |
我注意到了幾個可能的問題: 在 uart() 中斷函數(shù)中,你在接收到數(shù)據(jù)后立即發(fā)送了相同的數(shù)據(jù)回去,這可能不是你想要的行為。 在 panduan_jisuan() 函數(shù)中,你的代碼假設(shè)每個數(shù)字和運算符都是由單個字符表示的,且每個數(shù)字和運算符之間沒有任何空格或其他字符。如果輸入的表達式不滿足這些條件,你的代碼可能無法正確地解析和計算它。 同樣在 panduan_jisuan() 函數(shù)中,你的代碼只處理了第一個運算符和等號之后的字符,對于等號之后的字符,你的代碼并沒有進行處理。 你的代碼沒有處理除數(shù)為0的情況,如果輸入的表達式包含除以0的操作,你的代碼可能會產(chǎn)生錯誤。 在 main() 函數(shù)中,你使用了一個名為 flag 的變量來判斷是否已經(jīng)接收到數(shù)據(jù),但是你并沒有在任何地方初始化這個變量。如果這個變量的初始值不是0,你的代碼可能會在接收到任何數(shù)據(jù)之前就開始嘗試進行計算。 |
在您提供的代碼中,存在以下問題: chuankou_chushihua() 函數(shù)中缺少對串口引腳的配置。在8051單片機中,需要設(shè)置相應(yīng)的引腳(如P3.0和P3.1)為串口通信功能。 在主函數(shù) main() 中,調(diào)用 chuankou_chushihua() 函數(shù)時沒有傳入任何參數(shù),但是函數(shù)定義中有一個參數(shù)。 在 uart() 中斷函數(shù)中,nm 變量用于記錄接收到的字符數(shù)量,但未進行初始化。需要在主函數(shù)中添加類似 nm = 0; 的語句。 在 panduan_jisuan() 函數(shù)中,判斷數(shù)字范圍的條件語句錯誤。正確的條件應(yīng)為 '0' <= rec_data[i] && rec_data[i] <= '9'。此外,該條件語句也需要修正為 rec_data[i] 而不是 rec_data[0]。 在 panduan_jisuan() 函數(shù)中,返回值 ansi 應(yīng)在最后的 switch 語句之后進行賦值,而不是在進入循環(huán)時 |
1.累加的原因是沒清零,但我覺得連續(xù)累加這也是一個功能吧。 2.沒有優(yōu)先級是程序問題,建議使用堆棧處理數(shù)據(jù),同時解決只能一位運算的問題。 |
這個程序有幾個問題: 在程序開頭引入的頭文件reg52.h是基于8051單片機的,而不是適用于大多數(shù)現(xiàn)代的開發(fā)平臺。你可以考慮移除這個頭文件。 頭文件stdio.h中的printf函數(shù)和stdlib.h中的sprintf函數(shù)不能直接使用,因為它們是針對標準輸入輸出流的,而不是嵌入式系統(tǒng)中的串口通信。你需要自己實現(xiàn)串口發(fā)送函數(shù)和接收函數(shù)。 rec_data數(shù)組沒有進行邊界檢查,可能導致越界訪問。在處理接收到的數(shù)據(jù)之前,應(yīng)該先檢查接收到的數(shù)據(jù)長度是否超過了數(shù)組的長度。 沒有對變量nm進行初始化,可能導致未定義的行為。在使用或判斷nm之前,應(yīng)該將其初始化為合適的值。 在函數(shù)panduan_jisuan中,判斷數(shù)字是否在正確的范圍內(nèi)時,使用了錯誤的條件。應(yīng)該是'0'<=rec_data[i]&&rec_data[i]<='9'而不是'0'<=rec_data[0]&&rec_data[0]<='9'。 在函數(shù)panduan_jisuan中,在執(zhí)行完一個運算符后沒有重置op的值,可能導致后續(xù)運算出錯。在處理完一個運算符后,應(yīng)該將op重置為空字符。 在函數(shù)send_int_to_serial_port中,沒有定義變量i的類型和初始值。應(yīng)該在函數(shù)開頭定義并初始化變量i。 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎勵! |
buffer緩沖區(qū)不夠了,數(shù)據(jù)溢出了吧。 |
在計算結(jié)束后把存儲計算結(jié)果的變量清零 |
接收中斷發(fā)生時,需一次把所有接收字符接收完(沒有做到), send_int_to_serial_port這個函數(shù)想把接收表達式及結(jié)果發(fā)送出去,可buffer緩沖區(qū)中無內(nèi)容 |
Powered by 單片機教程網(wǎng)