『壹』 51單片機串口通信問題求解
51單片機串口通信接收數據和發送出去,這不是一個整個過程,即接收和發送沒有什麼關系的,是完全可以只發送,或只接收的,不需要接收就發出去的。
而且不論是接收或發送,每次都是一個位元組的,沒有什麼8個位元組的事。
但是每發送一個位元組,或接收一個位元組,數據本身是8個位,注意是8個位,並不是8個位元組。但是串口通信並不是只發送這8位數據,需要加一個起始位和一個停止位,組成一幀數據,共10個位。即是要發送一個位元組的8個位,需要加一個頭和一個尾,對8位數據包裝起來。
『貳』 51單片機串口接收數組數據並存儲
在使用51單片機進行串口接收數組數據時,可以採用開辟一個接收緩沖區的方法來存儲數據。具體代碼如下:
首先,定義一個數組變數和一個計數器變數:
#include
#define uchar unsigned char
uchar buf[16], num;
接著,設置中斷服務函數,用於處理串口接收到的數據:
void ser_isr() interrupt 4 {
if(RI) {
RI = 0;
buf[num] = SBUF;
num++;
num &= 0x0f;
}
}
在主函數中,進行初始化設置:
TMOD = 0x20;
SCON = 0x50;
TH1 = TL1 = 0xfd;
TR1 = 1;
ES = 1;
EA = 1;
while(1);
其中,TMOD、SCON、TH1、TL1、TR1、ES、EA是用於配置單片機相關寄存器的參數。
TMOD寄存器用於設置定時/計數器的工作模式。
SCON寄存器用於設置串口通信模式,0x50表示模式1,8位數據位,1位停止位,偶校驗。
TH1和TL1寄存器用於設置定時/計數器1的初始值,0xfd表示設置為定時模式,定時周期為64ms。
TR1用於啟動定時/計數器1。
ES用於使能串口中斷。
EA用於使能總中斷。
這樣的配置能夠確保單片機正確接收並存儲串口數據。
需要注意的是,num變數的更新方式可以防止數組越界,通過與0x0f進行按位與操作,可以確保num的值始終在0到15之間。
整個程序通過不斷循環運行,等待新的串口數據到來,並將其存儲到數組buf中。
這種方式適用於需要接收和處理一定數量串口數據的應用場景。
在實際應用中,可以根據具體需求調整數組buf的大小,以及配置定時/計數器的值,以適應不同的通信速率和數據處理需求。
『叄』 關於51單片機串口通信接收多位數據
是你串口中斷接收數據溢出了。應該改為
if(RI)
{
receive[i]=SBUF;
i++; //此處的i需要定義為全局變數,不然你每次都會被清零,也就是數據永 遠都是recive[0]=SBUF;
if(i>?) //此處填寫你的數據最大長度,主程序中數據分析完自後要對i清零。
{
i=0;
}
}
if(TI)
{
TI=0;
........//發送程序
}
『肆』 請教一個單片機8位串口發送的問題
由於你把8位的所有位數都用作表示數字,所以導致255以內的數和255以上的數無法分開。
這個問題的關鍵是怎麼讓電腦知道你什麼時候發的數字是8位的,什麼時候發的數字是16位拆成兩個8位的對吧!
我這里說一個方法吧!你可以把8位全一作為一個判斷符,如果電腦受到一個全一的字元,那麼接受到的下兩個位元組就進行拼接。
例如需要發送254,那麼直接發送一個位元組即可。
如果發送255,可以這樣:
先發送 11111111
然後發送 00000000 11111111
這樣拼接得到255
如果是發送 1024,可以這樣:
先發送 11111111
然後發送 00000100 00000000
當然,這樣可能傳輸效率有所降低,但也不會太差!