找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3947|回復(fù): 14
收起左側(cè)

51單片機(jī)怎樣對從串口接收到的數(shù)學(xué)運(yùn)算式進(jìn)行運(yùn)算

  [復(fù)制鏈接]
ID:110648 發(fā)表于 2016-3-24 21:56 | 顯示全部樓層 |閱讀模式
51中單片機(jī)怎樣對從串口接收到的數(shù)學(xué)運(yùn)算式進(jìn)行運(yùn)算,并把運(yùn)算結(jié)果再輸出到串口?
回復(fù)

使用道具 舉報(bào)

ID:110666 發(fā)表于 2016-3-25 00:05 | 顯示全部樓層
通過程序控制。
回復(fù)

使用道具 舉報(bào)

ID:97438 發(fā)表于 2016-3-25 11:08 | 顯示全部樓層
什么數(shù)學(xué)運(yùn)算式?如果傳過來的是字符串“1+1”這樣的話,你需要自己解釋這個(gè)字符串,再做運(yùn)算

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:110694 發(fā)表于 2016-3-25 11:21 | 顯示全部樓層
一般單片機(jī)收到的數(shù)據(jù)是根據(jù)你定的協(xié)議來的,你的傳輸協(xié)議應(yīng)該規(guī)定了哪個(gè)字符是什么意思。如果像你說的串口收到數(shù)學(xué)運(yùn)算式,那么你收到數(shù)據(jù)后對數(shù)據(jù)一個(gè)一個(gè)解析出來再運(yùn)算就可以了。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:110694 發(fā)表于 2016-3-25 11:22 | 顯示全部樓層
算出來結(jié)果以后再通過串口發(fā)出去啊

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:110715 發(fā)表于 2016-3-25 13:09 | 顯示全部樓層
我也想知道,求解答
回復(fù)

使用道具 舉報(bào)

ID:110648 發(fā)表于 2016-3-25 15:18 | 顯示全部樓層
luoluoluo136 發(fā)表于 2016-3-25 11:08
什么數(shù)學(xué)運(yùn)算式?如果傳過來的是字符串“1+1”這樣的話,你需要自己解釋這個(gè)字符串,再做運(yùn)算

就是像(2+3)*3這樣計(jì)算器的功能,具體怎么解釋

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:110648 發(fā)表于 2016-3-25 15:20 | 顯示全部樓層
129 發(fā)表于 2016-3-25 11:21
一般單片機(jī)收到的數(shù)據(jù)是根據(jù)你定的協(xié)議來的,你的傳輸協(xié)議應(yīng)該規(guī)定了哪個(gè)字符是什么意思。如果像你說的串口 ...

怎樣對字符進(jìn)行解析啊

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:97438 發(fā)表于 2016-3-26 16:11 | 顯示全部樓層
先在字符串中找運(yùn)算符號,然后運(yùn)算符號之間的就是數(shù)值了,然后就是字符串轉(zhuǎn)數(shù)值,再進(jìn)行運(yùn)算

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:114742 發(fā)表于 2016-5-5 19:16 | 顯示全部樓層
luoluoluo136 發(fā)表于 2016-3-26 16:11
先在字符串中找運(yùn)算符號,然后運(yùn)算符號之間的就是數(shù)值了,然后就是字符串轉(zhuǎn)數(shù)值,再進(jìn)行運(yùn)算

可是串口接收的時(shí)候會出現(xiàn)數(shù)據(jù)不完整的情況呀比如123456可能會顯示12356少一些數(shù)據(jù)怎么辦呀

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:97438 發(fā)表于 2016-5-6 08:45 | 顯示全部樓層
3263065307 發(fā)表于 2016-5-5 19:16
可是串口接收的時(shí)候會出現(xiàn)數(shù)據(jù)不完整的情況呀比如123456可能會顯示12356少一些數(shù)據(jù)怎么辦呀

這個(gè)就是你串口處理的問題了額。。。數(shù)據(jù)基礎(chǔ)問題沒有解決好。。。建議你先去做一下串口收發(fā)的程序,調(diào)通了再去搞運(yùn)算

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:114742 發(fā)表于 2016-5-7 20:45 | 顯示全部樓層
luoluoluo136 發(fā)表于 2016-5-6 08:45
這個(gè)就是你串口處理的問題了額。。。數(shù)據(jù)基礎(chǔ)問題沒有解決好。。。建議你先去做一下串口收發(fā)的程序,調(diào)通 ...

我感覺我的數(shù)據(jù)處理沒問題呀,就是會出現(xiàn)那種現(xiàn)象你看看我的代碼
void uart() interrupt 4
{
           unsigned char dat;
           if(RI)
          {
                   dat = SBUF;            //接收到的數(shù)據(jù)暫存在dat中
                  datebuf[ i]=dat;
                  SBUF = dat;                //接收到的數(shù)據(jù)發(fā)送給PC機(jī)
                  while(TI==0);        //等待發(fā)送完成,發(fā)送使用的查詢方式
                  i++;
                   TI = 0;                        //清除發(fā)送結(jié)束標(biāo)志
                  RI = 0;                        //清除接收中斷標(biāo)志
          }
}

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:910922 發(fā)表于 2021-4-23 17:01 | 顯示全部樓層
luoluoluo136 發(fā)表于 2016-3-25 11:08
什么數(shù)學(xué)運(yùn)算式?如果傳過來的是字符串“1+1”這樣的話,你需要自己解釋這個(gè)字符串,再做運(yùn)算

請問解釋完字符串后,如何計(jì)算數(shù)據(jù)得到結(jié)果,并輸出
回復(fù)

使用道具 舉報(bào)

ID:911163 發(fā)表于 2021-4-24 07:46 | 顯示全部樓層
51單片機(jī)的串口,是個(gè)全雙工的串口,發(fā)送數(shù)據(jù)的同時(shí),還可以接收數(shù)據(jù)。
當(dāng)串行發(fā)送完畢后,將在標(biāo)志位 TI 置 1,同樣,當(dāng)收到了數(shù)據(jù)后,也會在 RI 置 1。
無論 RI 或 TI 出現(xiàn)了 1,只要串口中斷處于開放狀態(tài),單片機(jī)都會進(jìn)入串口中斷處理程序。
在中斷程序中,要區(qū)分出來究竟是發(fā)送引起的中斷,還是接收引起的中斷,然后分別進(jìn)行處理。
看到過一些書籍和文章,在串口收、發(fā)數(shù)據(jù)的處理方法上,很多人都有不妥之處。
接收數(shù)據(jù)時(shí),基本上都是使用“中斷方式”,這是正確合理的。
即:每當(dāng)收到一個(gè)新數(shù)據(jù),就在中斷函數(shù)中,把 RI 清零,并用一個(gè)變量,通知主函數(shù),收到了新數(shù)據(jù)。
發(fā)送數(shù)據(jù)時(shí),很多的程序都是使用的“查詢方式”,就是執(zhí)行 while(TI ==0); 這樣的語句來等待發(fā)送完畢。
這時(shí),處理不好的話,就可能帶來問題。
看了一些網(wǎng)友編寫的程序,發(fā)現(xiàn)有如下幾條容易出錯(cuò):
1.有人在發(fā)送數(shù)據(jù)之前,先關(guān)閉了串口中斷!等待發(fā)送完畢后,再打開串口中斷。
這樣,在發(fā)送數(shù)據(jù)的等待期間內(nèi),如果收到了數(shù)據(jù),將不能進(jìn)入中斷函數(shù),也就不會保存的這個(gè)新收到的數(shù)據(jù)。
這種處理方法,就會遺漏收到的數(shù)據(jù)。
2.有人在發(fā)送數(shù)據(jù)之前,并沒有關(guān)閉串口中斷,當(dāng) TI = 1 時(shí),是可以進(jìn)入中斷程序的。
但是,卻在中斷函數(shù)中,將 TI 清零!
這樣,在主函數(shù)中的while(TI ==0);,將永遠(yuǎn)等不到發(fā)送結(jié)束的標(biāo)志。
3.還有人在中斷程序中,并沒有區(qū)分中斷的來源,反而讓發(fā)送引起的中斷,執(zhí)行了接收中斷的程序。
對此,做而論道發(fā)表自己常用的方法:
接收數(shù)據(jù)時(shí),使用“中斷方式”,清除 RI 后,用一個(gè)變量通知主函數(shù),收到新數(shù)據(jù)。
發(fā)送數(shù)據(jù)時(shí),也用“中斷方式”,清除 TI 后,用另一個(gè)變量通知主函數(shù),數(shù)據(jù)發(fā)送完畢。
這樣一來,收、發(fā)兩者基本一致,編寫程序也很規(guī)范、易懂。
更重要的是,主函數(shù)中,不用在那兒死等發(fā)送完畢,可以有更多的時(shí)間查看其它的標(biāo)志。
回復(fù)

使用道具 舉報(bào)

ID:909161 發(fā)表于 2021-4-24 11:14 | 顯示全部樓層
以查詢?yōu)槔唵蝸碚f,就是利用軟件(代碼)去判斷、查詢TI和RI標(biāo)志位的狀態(tài),然后依據(jù)其狀態(tài)去執(zhí)行各種操作。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表