A. 單片機串口接收到數據後,如果不讀取數據,再次發送會不會產生串口中斷
如果不讀取數據,對應的標志位不會被清零,再次發送會產生中斷標志,但是會有溢出錯誤。
B. 單片機接收串口數據
你通過串口助手要接受字元串或一組數據需要在單片機端開辟一個緩沖區,否則可能丟失數據。
以下程序是較為通用的串口收發常式,開辟一個16位元組的緩沖區,兩個指針,一個存數指針,一個取數指針,兩指針相等,證明沒有新的接收數據。
#include<reg51.h>
#define uchar unsigned char
uchar buf[16],getptr,putptr;
void uart_isr() interrupt 4
{
if(RI)
{
RI=0;
buf[putptr]=SBUF;
putptr++;
putptr&=0x0f;
}
}
main()
{
TMOD=0x20;
SCON=0x50;
TH1=TL1=0xfd;
TR1=1;
ES=1;
EA=1;
putptr=0;
getptr=0;
while(1)
{
if(getptr!=putptr) //取數指針和存數指針如果不等
{
SBUF=buf[getptr];
getptr++;
getptr&=0x0f;
while(!TI);
TI=0;
}
}
}
C. 怎麼用單片機確定串口接收數據的時間間隔
肯定是先要設置定時器,但是定時器也不能設置那麼長的時間間隔,可以設置100mS,然後再定時器中斷里用一個變數計數,計10次就是1S咯,一個單元最大值為255,也就是最長可以255*100mS,如果要更長,就用兩個單元計數,最長就變成255*255*100mS,依次類推就行了。
關於換行的問題,換行符也是一個ASII碼,找到對應的ASII碼,然後發送就行了。
1. 什麼是波特率
不管是什麼單片機,在使用串口通信的時候,有一個非常重要的參數:波特率。什麼是波特率:波特率就是每秒傳送的位元組數。雙方在傳輸數據的過程中,波特率一致,這是通訊成功的基本保障。下面以STM32單片機為例,講解一下串口波特率的計算方法。
STM32波特率相關的寄存器
STM32單片機設置波特率的寄存器只有一個:USART_BRR寄存器,
波特率寄存器
該寄存器的有效位數為16位,前4位用於存放小數部分,後12位用於存放整數部分。將波特率算出來後,數值填入這個波特率就可以了。
D. 51單片機的串口接收一幀數據有幾位
發送的位數跟工作方式有關。51單片機的發送和接受,只有10位和11位兩種。
先說單片機串口的工作方式:
單片機串口的工作方式共4種,方式0--方式3.
方式0:用移位脈沖。RXD做輸入/輸出,TXD進行移位。收發的數據為八位。
方式1:傳送一幀信息為10位,即1位起始位(0),8位數據位(低位在先)和1位停止位(1)。數據位由TXD發送,由RXD接收
方式1:一幀信息也是10位;即 1位起始位,8位數據位(先低位),1位停止位。在起始位到達移位寄存器的最左位時,它使控制電路進行最後一次移位。
方式2和方式3:發送(通過TXD)和接收(通過RXD)一幀信息都是 11位: 1位起始位(0), 8位數據位(低位在先),1位可編程位(即第9位數據)和1位停止位(1)。
可見:不論單片機串口接收還是發送一幀數據是多少位,實際有效位數據位都是8位,其餘位是為了奇偶校驗、做起始位或終止位用的。
以前所述有誤,特修正。
E. 編程實現stm32單片機串口的數據收發
int main(void)
{
u16 t;
u16 len;
u16 times=0;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先順序,2位響應優先順序
uart_init(115200); //串口初始化為115200
LED_Init(); //LED埠初始化
KEY_Init(); //初始化與按鍵連接的硬體介面
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的數據長度
printf("\r\n您發送的消息為:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1發送數據
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
}
printf("\r\n\r\n");//插入換行
USART_RX_STA=0;
}
}
}
F. 關於單片機串口發送和接收問題:連續發送過來的數據如何接收
不會的了
設備與設備之間要有一定的通信協議才能有良好的通信過程
比較明顯的就是要配置一樣的波特率
如用9600的波特率
那代表1S發送9600位也就是9600/8=1200個位元組
也就是1S/1200約為1MS左右的時間發送位元組
單片機處理速度都是微秒級別的
在接收到第一個位元組後完全有時間處理再接收
不過時間不能太長
另外串口接收用中斷接收比較保險
中斷程序中只做存儲數據很簡單的判斷
接收完整後再處理所有的數據
G. C51單片機如何從PC機串口接收字元串
1、單片機串口不管從哪
接收數據
都是遵循串口協議的。字元串就是一個挨一個的ASKII碼,中間沒有加任何東西。2、不發字元串結束標志。3、回車符可以發送,但具體發不發送看你程序了。
H. 51單片機串口接收字元串
51單片機串口接收字元串,接收的字元串長度不定,無結束符,要判斷這個字元串結束,確實比較難。如果每個字元串還是連續發送,幾乎是無法判斷的。如果每個字元串之前有一定的空閑時間,可以根據最短的空閑時間來判斷結束。即接收每一個字元都開始計時,接收下一個字元結束計時,如果計時的時間超過最短的空閑時間,則前一個字元為結束,且新字元串開始。並再重新計時。
I. 單片機串口為什麼接收數據開中斷
串口接收寄存器SBUF收到數據後會把接收標志位RI置位的,
電腦發送數據是一個位元組接著一個位元組,兩個位元組之間會有延時,所以收到數據你需要盡快處理,不然可能會被新的數據覆蓋,配置中斷就是為了及時響應把數據讀出存儲起來。所以SBUF內收到數據後RI就會置1,在中斷里把數據存儲
然後及時把RI清零接收下一位元組數據。
J. 單片機串口如何接收
在主程序中對接收到的數據串進行處理,查找幀頭、提取有效數據、進行業務判斷。
首先,要知道中斷應當盡量簡潔,所以中斷裡面只做數據接收和下標移動。
其次,要知道每幀的最大長度。幀長度要是毫無限制那緩沖區就不好開了,得採用適用性更強的緩沖技術,這里就不提了。舉例假定數據量最多10位元組,則最長幀為13位元組,可開辟16位元組緩沖區。
再次,要知道通信協議是怎麼樣的,傳輸速率如何(與單片機處理能力相比),每幀的數據之間有多少間隔,幀與幀之間有多少間隔。
間隔太短的話需要增加許多額外的處理,例如幀頭識別、幀分割,必要時又得用較大容量的循環緩沖區……這里也不提了。舉例假定幀間有足夠多的間隔時間。