![]() |
發布時間: 2024-5-8 12:42
正文摘要:大家好,摸索很久還是沒弄清楚,請教大家問題,請給予指點。謝謝大家 51單片機雙機通信, 問題一:我想發送250這個十進制數,接收端接收的是否是經過轉換的16進制數,如果我要在接收端存儲或者比較這個數大小 ... |
samxon 發表于 2024-5-8 16:02 雖然你寫的是十進制250,但發送端發送的不是十進制,而是0xfa, 接收端接收的是0xfa代表能正確接收,單片機可以存儲或者比較這個數的大小。 在單片機里面不需要轉成10進制數。 單片機不能理解你的“10進制數”,只有輸出到顯示設備時才要轉換成“10進制” 的格式。 |
5樓是高手,串口用ASCII碼傳送數據、字符。 |
主機發,所有從機一起收就可以。暫時沒用到這么復雜 |
samxon 發表于 2024-5-8 18:01 多機通信主要難點在解決從機沖突問題,比如我想從機a顯示200,從機b顯示130,你就要定義一個通信協議,每個從機都要有個id才能實現了,更復雜的還有很多,比如如何校驗通信數據,如何加密通信數據等 |
C語言中250就是十進制的250,16進制要寫成0xfa,0x就是16進制的標識,250+0xfa=500=0x01f4 |
samxon 發表于 2024-5-8 16:02 不要糾結進制問題,你寫的250到了單片機那里也不是十進制,一律是二進制。 |
在你串口程序正確的前提下: 1,串口接收到數據,250就是250,0xFA就是0xFA,沒有進制這個說法的 2,數碼管顯示是要查詢段碼再進行顯示的,這個單片機的基礎知識 3,你要先寫好一個數碼管顯示程序,調試的時候先直接顯示一個變量的值,不要管什么串口之類的,只管顯示,先保證顯示程序是OK的 4,代碼先從最小的塊寫起,最后堆積起來就是一個完整的程序了 |
xiaobendan001 發表于 2024-5-8 17:06 好像不對,1650也一樣要查詢段碼的,不好意思,用的少,忘記了。 |
samxon 發表于 2024-5-8 16:02 接收端顯示和是否傳輸沒關系,5樓的方法可以,實際上/100后不需要%10,因為一共char除100剩下的最多就是2。這樣dispbuff[]中的三個數就是你要送到例如TM1650這種芯片的數據了。又或者別的比如查詢到段碼輸出到595上面。這要看你的顯示電路架構了。 |
qq475878026 發表于 2024-5-8 16:31 謝謝大家耐心指導,就是糾結進制轉換問題。我先寫個代碼試試看 |
samxon 發表于 2024-5-8 16:02 就比如set1這個變量,你可以說它是0xFA,也可以說它是250都沒錯,但它只是存在RAM里的一個數據,按11111010排列罷了 |
串口通訊實際也是需要協議的,自己規定的協議。不然你發送幾個字節,另一臺接收設備怎么解讀這幾個字節? |
samxon 發表于 2024-5-8 15:34 就是按五樓的方法,你不用糾結接收端收到的是0xFA還是250,因為接收端接收的就是一堆0和1。數碼管需要顯示十進制,那就把set1看成十進制,然后按五樓方法把百位十位個位分開來一個個顯示。 |
lkc8210 發表于 2024-5-8 15:48 謝謝你,我沒有問明白。 雖然發送端發送的是十進制250,但接收端接收的是一個16進制數。也就是0xFA, 我要把0xFA在數碼管上顯示250, 是否需要轉換,如果需要,是如何轉換的。 |
samxon 發表于 2024-5-8 15:34 按位取值 RecBuff = SBUF; DispBuff[0] = RecBuff /100%10; DispBuff[1] = RecBuff /10%10; DispBuff[2] = RecBuff %10; |
qq475878026 發表于 2024-5-8 15:17 你好,謝謝你的答復,進一步請教, 比如發送端發送的是250,接收端接收的是0xFA, 接收端要把接收到的0xFA顯示到數碼管為250,這之間是怎么轉換的。 |
傳輸沒有進制說法,250換成16進制是0xFA,那么以下發送函數 (1)set1=250;SBUF=set1;(2)set1=0xFA;SBUF=set1;單片機處理過程都是一樣的。 |
發的啥收的就是啥,無論多少進制,在傳輸中都一樣,是否轉換只是你要顯示的時候才有需要。比如你要在數碼管上顯示就要轉換BCD碼送給顯示芯片或者要再查詢出對應的段碼信息送給比如595或者164這樣的。或者直接送到某個端口。 |