![]() |
123156fsadf 發表于 2023-5-23 17:19 謝謝大佬,已解決 |
格式化無悔 發表于 2024-6-6 16:37 我現在數據接收到了(4個字節),一個字節一個字節的收到的,但是不知道怎么組合起來,是應該相加還是怎么辦,怎么把這四個字節的數據組合成10進制的數 |
是7位數,還是7bit?兩者是不同概念的。 前者開一個緩存,依次接收趣入即可,后者自定義數據類型,按需要處理后再存入。 |
用數組,多少位都可以 |
wulin 發表于 2023-5-24 09:52 努力看明白 |
123456ZXC1 發表于 2023-5-24 12:31 這個是7位數啊 ,怎么能uchar |
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit RX = P3^0; // 串口接收引腳 uchar receivedData = 0; // 存儲接收到的數據 // 串口初始化函數 void InitUART() { TMOD = 0x20; // 設置定時器1為模式2(8位自動重裝) SCON = 0x50; // 設置串口工作在模式1(8位數據,可變波特率) TH1 = 0xFD; // 設置波特率為9600,晶振頻率11.0592MHz TR1 = 1; // 啟動定時器1 } // 串口接收中斷處理函數 void UART_ISR() interrupt 4 { if (RI) { // 接收到數據 RI = 0; // 清除接收中斷標志 // 獲取接收到的數據 uchar data = SBUF; // 忽略最高位的數據位(第8位) receivedData = data & 0x7F; } } // 延時函數 void Delay(uint del) { uint i, j; for (i = 0; i < del; i++) { for (j = 0; j < 1827; j++) { // 空循環 } } } void main() { InitUART(); // 初始化串口 // 啟用全局中斷 EA = 1; // 啟用串口接收中斷 ES = 1; while (1) { // 在這里可以使用 receivedData 變量進行處理,比如打印到LCD等 // 這里只是簡單的延時示例,可根據需要修改 Delay(100); } } |
串口總是按字節一個一個的接收二進制數,它可不管什么這個數那個數的花花定義。 至于7位數據什么的,關鍵在于你如何將這個7位數據,按字節拆分(發送時)、組合(接收時,復原)。 |
樓主語焉不詳,地板回復應該是樓主想要的,但樓主未必能看明白。 |
把接收到的數據屏蔽最高位(&07F),這樣不就是把8位當7位接收了,不過這種在51單片機中是不得以的方法,在高級單片機就能設置相應的接收位數 |
卡住你的不是什么10進制,而是7位數。你可以開個緩存(7字節),收到第一個字節存入緩存第一個地址中,,,第7個存入7中。。。 |
串口收發的都是數據,都是“16進制”,“10進制'也是當成"16進制"來收發,其實對串口來說都是2進制,根本沒有x進制這個說法,有的只是后數據的處理才出現什么10進制之類的 |
3個字節就可以了,比如1234567,你放到一個unsigned long的變量中,將右邊24位分別放入一個3字節的buf中,buf[0] = temp_long >> 16;buf[1] = temp_long >> 8; buf[2] = temp_long & 0xFF; 然后發送這個數組就好了。接收到數據后通過左移操作還原成unsigned long變量即可 |
雙方定義收發浮點數,串口4個字節就可實現7位10進制數收發。 |
1. 用聯合體 2. 用字符串 |