A. 串口接收比較好的處理方式
串口接收比較好的處理方式如下。
1.設定好通訊協議,如包頭+長度+數據+校驗+包尾,那麼中斷中每收到一個位元組就判斷,直到收到包尾為止。這是51時代用得比較多的狀態機接收流程。
但如果由於接收中斷被嵌套,或干擾等原因導致一幀數據的後部分丟失,就是說接收不到包尾,那麼這個狀態機如何能自動復位以便接收下一幀?
2.串口空閑中斷也是用得比較多的一種方法,但是波特率較高的時候,空閑中斷的觸發時間相應變短,使得接收中斷不被打斷的要求變高,如果接收中斷被耽誤了,從而觸發空閑中斷,也是收不到完整數據。
3.定時器中斷代替串口空閑中斷,這個可以避免串口空閑中斷時間不夠的問題,因為這個定時器中斷可以自己設置。但是一個串口需要搭配一個定時器使用,不爽。
4.串口接收只把數據放到緩存,此外不做任何事情。然後在另一個線程不斷parse這個緩存,從頭開始找其中有沒有符合一幀的數據,如果有就是解析,同時將這一幀從緩存中刪掉,如果沒有就什麼也不做。這樣的程序就不用管一幀是否結束,可以較好的適應各種收不全、丟數據的問題。
B. vb怎樣讀取串口數據並進行處理
VB6.0可使用MsComm控制項實現串口通信。按通信協議和數據幀規約接收和處理數據。
MSComm 控制項通過串列埠傳輸和接收數據,為應用程序提供串列通訊功能。
MSComm 控制項提供下列兩種處理通訊的方式:
事件驅動通訊是處理串列埠交互作用的一種非常有效的方法。在許多情況下,在事件發生時需要得到通知,例如,在 Carrier Detect (CD) 或
Request To Send (RTS) 線上一個字元到達或一個變化發生時。在這些情況下,可以利用 MSComm 控制項的 OnComm
事件捕獲並處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱 CommEvent
屬性。
在程序的每個關鍵功能之後,可以通過檢查 CommEvent 屬性的值來查詢事件和錯誤。如果應用程序較小,並且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字元都產生事件,因為唯一等待接收的字元是數據機的「確定」響應。
盡管 MSComm 控制項有很多重要的屬性,但首先必須熟悉幾個屬性。
C. 51單片機通過串口實現數據的發送與接收程序
串口收發,要有通信協議。也就是什麼時候開始接收,接收到指令後,轉發什麼數據。這個要知道,才可以寫。而且使用不同的51單片機,其內部寄存器配置是不同的。
一般來說,過程如下:
1,配置串口參數、波特率等,開啟串口中斷;
void Init_UART()
{
}
2,中斷函數里寫中斷響應函數,根據接收的指令或者數據,執行相應的動作;
程序一般為:
void UART_ISR() interrupt x using y
{
;串口中斷處理函數
}
x - 單片機的C51中斷號
y - 指定使用的當前工作寄存器組號(0-3 PSW中的RS0,RS1組合)
3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//數據發送函數
}
}
D. 怎樣編寫單片機的串口通信的程序,一般的步驟是怎麼樣
編寫串口通訊程序步驟為:
1、設置波特率
2、設置串口工作方式
3、收發數據。
比如:
main()
{
unsignedchardat;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
while(RI==0);
RI=0;
dat=SBUF;
SBUF=~dat;
while(TI==0)
TI=0;
}
}
E. 串口通信程序
根據你的要求,寫了幾個簡單的子函數。 #include<reg52.h>
#define N 6 //方便修改密碼的長度
sbit key=P1^0; //確定發送密碼,發送完後將密碼清0
unsigned char i,a[N]; //定義數組來存放密碼 void serial_init()//串口初始化
{
TMOD=0x20;//設置定時器1為工作方式2
TH1=0xfd; //波特率為9600,標准波特率
TL1=0xfd;
TR1=1; //啟動定時器1
PCON&=0x7f; //SMOD=0,這里不需要倍頻
SCON=0x40; //設置串口為工作方式1
} void serial_send() //串口發送函數
{
for(i=0;i<N;i++)
{
TI=0; //串口發送完畢標志位清0
SBUF=a[i]; //發送數組中存放的密碼字元
while(!TI); //等待發送完畢
}
} void keyscan() //鍵盤掃描
{
if(!key) //用獨立鍵盤簡單舉例,按下為低電平
{
delay(10);//延時10毫秒,去抖。delay()函數省略
if(!key)
{ while(!key); //鬆手監測
serial_send(); //發送密碼
for(i=0;i<N;i++) //發送完畢清0
a[i]=0;
}
}
} void main(){ serial_send() ; while(1) { keyscan() ; }}大概就是這個思路,你可以把密碼鍵盤的值都寫在keyscan()函數里,可以加刪除鍵(密碼輸錯可以退格),最好加個顯示,密碼雖然不能顯示出來,但還是要顯示輸入的個數吧。還有個要提醒你的,就是上位機軟體的編寫,下位機發送的格式要與上位機接收的格式對應(字元或者數字)。