熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
Y_G_G 發(fā)表于 2022-10-19 14:01 感謝各位大佬回復(fù)。終于搞清楚了,是從機(jī)模塊,接收發(fā)送切換太快,主機(jī)的接收漏收了。從機(jī)加了延時(shí)好了。 |
gaima 發(fā)表于 2022-10-18 22:50 增加一個(gè)全局變量 T0_1ms_uart 這個(gè)變量在定時(shí)器中斷中++ //定時(shí)器中斷 { if(T0_1ms_uart<250)T0_1ms_uart++;//串口時(shí)間++} 這個(gè)變量在串口中斷中,每次接收到一個(gè)字節(jié)數(shù)據(jù)就清除 //串口中斷 { T0_1ms_uart=0//接收完一個(gè)字節(jié)數(shù)據(jù),重新計(jì)時(shí) } 你就可以在while中增加一個(gè) T0_1ms_uart>某個(gè)時(shí)間 這樣的判斷 只要T0_1ms_uart的值大于你設(shè)定的值,比如200mS,就說(shuō)明:在串口接收完一個(gè)字節(jié)的數(shù)據(jù)之后,超過(guò)200mS就再?zèng)]有接收到新的數(shù)據(jù)了 |
Y_G_G 發(fā)表于 2022-10-14 16:32 感謝大佬回復(fù),是考慮到指令發(fā)出,處理,再接收,中間這段時(shí)間不可控。主機(jī)用while(count),那萬(wàn)一沒(méi)收到信號(hào),就要無(wú)限死機(jī)了,再加定時(shí)器的話,不是跟Delay(200)的延時(shí)一樣的嘛。這問(wèn)題困擾我好久了。 |
gaima 發(fā)表于 2022-10-14 09:15 不管是發(fā)送還是接收,正常來(lái)說(shuō),都不會(huì)用Delay(200)這種函數(shù)的 不管是發(fā)送/接收的數(shù)據(jù)是多少個(gè)字節(jié)的,都是同時(shí)進(jìn)行的 中斷中要檢測(cè)是發(fā)送還是接收中斷,只在中斷中緩存數(shù)據(jù) 所有的數(shù)據(jù)又不是同步的,有時(shí)候你還沒(méi)發(fā)送完,就接收到一個(gè)數(shù)據(jù)了 |
串口時(shí)序都是固定的,怎么會(huì)亂?亂的是你的波特率或數(shù)據(jù)格式不對(duì),導(dǎo)致亂碼。 |
Y_G_G 發(fā)表于 2022-10-13 13:18 欣瑞達(dá)或者迪文串口屏,它就是8字節(jié)指令,所以發(fā)送函數(shù)用的同一個(gè)。但是接收函數(shù)就不行了,空調(diào)機(jī)一個(gè)指令就有43個(gè)字節(jié)。我給定義了一個(gè)接收長(zhǎng)度。懷疑發(fā)送delay時(shí),接收中斷已經(jīng)啟動(dòng),但是接收長(zhǎng)度還使用的上一個(gè)長(zhǎng)度。 |
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2022-10-13 12:19 感謝,有樣例,我學(xué)習(xí)最快了。 |
gaima 發(fā)表于 2022-10-12 22:50 如果你用串口屏,那就應(yīng)該用跟串口屏一樣的協(xié)議,這樣一來(lái),串口屏和空調(diào)控制就可以用相同的函數(shù)了 不用再自己搞一個(gè)什么協(xié)議 一般串口屏都有協(xié)議的 |
gaima 發(fā)表于 2022-10-12 20:07 在規(guī)定時(shí)間沒(méi)有收到回復(fù),說(shuō)明這一路有故障放棄,然后通知下一路,同樣過(guò)程。 |
用的是串口中斷,我用485轉(zhuǎn)usb試驗(yàn),延時(shí)200,8字節(jié)數(shù)據(jù)才能完整的收到。懷疑是延時(shí)200里,已經(jīng)接收到數(shù)據(jù)了。用max485,發(fā)送轉(zhuǎn)接收,這主機(jī)接收完全沒(méi)反應(yīng)。用自動(dòng)收發(fā)的485芯片,才看到我要的接收反饋5A A5。我只想做到基本的一問(wèn)一答,主機(jī)和從機(jī)都是我寫(xiě)的,還扯不到rtu協(xié)議吧。 |
協(xié)議不是這樣定義的,可以借用MODBUS協(xié)議 |
人中狼 發(fā)表于 2022-10-12 21:32 因?yàn)閺臋C(jī)也是我瞎編的,都還沒(méi)加入crc檢驗(yàn),協(xié)議按自己想的簡(jiǎn)單的來(lái)。我希望先架好框架,通訊正常順暢,采集到的數(shù)據(jù)直接轉(zhuǎn)到串口屏上去。 |
這是協(xié)議設(shè)計(jì)的問(wèn)題,你現(xiàn)在的通訊協(xié)議不合適,或者可以說(shuō)不算是通訊協(xié)議 |
xuyaqi 發(fā)表于 2022-10-12 19:36 對(duì),就這個(gè)意思,我該怎么寫(xiě),收到這個(gè)回復(fù)?光是加長(zhǎng)delay,沒(méi)效果。 |
gaima 發(fā)表于 2022-10-12 19:04 明顯0101收到,在你的等待時(shí)間沒(méi)有回復(fù)你,所以你得要求對(duì)方收到馬上回復(fù)你,你收到0101回復(fù)后再通知下一位,這樣才不會(huì)亂。 |
gaima 發(fā)表于 2022-10-12 19:04 你先去看一下,是不是Modbus 如果是,就不是你這種時(shí)序了 應(yīng)該是接收和發(fā)送同時(shí)進(jìn)行的 每接收一個(gè)字節(jié)的數(shù)據(jù)就保存一次,30mS沒(méi)有接收到下一個(gè)字節(jié),就認(rèn)為是數(shù)據(jù)結(jié)束了 接收是要開(kāi)啟中斷進(jìn)行接收的,你不知道什么時(shí)候來(lái)數(shù)據(jù)的 單片機(jī)發(fā)送是另外一個(gè)程序,跟接收不一樣的,你只管發(fā)送就行 |
感謝各位大佬回復(fù)。我是按照0101,延時(shí)等待回復(fù);0104,延時(shí)等待回復(fù);0103,延時(shí)等待回復(fù),0102,延時(shí)等待。收到回復(fù)判斷驗(yàn)證下,再發(fā)去5A A5,F(xiàn)在第一條,0104的指令發(fā)出,后才收到0101的回答指令。順序亂了,影響我準(zhǔn)確性。我加長(zhǎng)延時(shí)也沒(méi)用。還有0104、0103、0102的指令還有幾率發(fā)不出被吞。 485單獨(dú)測(cè)試從機(jī),幾乎不會(huì)漏發(fā),響應(yīng)時(shí)間也就30ms左右。 |
把讀空調(diào)機(jī)狀態(tài),讀空調(diào)傳感器命令格式及回答格式搞清楚,就不會(huì)覺(jué)得亂。 |
感覺(jué)這就是Modbus,沒(méi)什么亂不亂的 按照協(xié)議寫(xiě)就行 |
先構(gòu)思一下,如何將數(shù)據(jù)整理成:你所認(rèn)為的不亂,而后再按你整理的次序進(jìn)行收發(fā)。 |
Powered by 單片機(jī)教程網(wǎng)