? ? 最近接觸到了串口通信變成,但是對串口底層通信不是很了解叶摄,有其是對串口的流控制属韧,今晚查了一些資料,算是有了一個比較清楚的認(rèn)識蛤吓,在此處記錄一下宵喂。
? ? 要深入理解一個問題,我覺得首先應(yīng)該搞清楚他為何而來会傲。串口為何需要流控制锅棕,是為了確保數(shù)據(jù)傳輸中的安全性,這個安全性是發(fā)送接收雙方的數(shù)據(jù)處理速度不一致導(dǎo)致的淌山。接收方的數(shù)據(jù)處理速度慢于數(shù)據(jù)發(fā)送方的時候裸燎,接收方的緩沖區(qū)寫滿之后會造成數(shù)據(jù)丟失。因此需要串口流控制來協(xié)調(diào)數(shù)據(jù)收發(fā)的雙方泼疑。
? ? 從以上的分析可以看出串口流控制的主導(dǎo)方是串口數(shù)據(jù)的接收方德绿,理清楚這個問題之后,串口的流控制問題將變得非常容易。串口通信首先發(fā)送方告訴接受方我這邊準(zhǔn)備好了(發(fā)送方DTR有效脆炎,導(dǎo)致接收方DSR有效)梅猿,你那邊是啥情況,接收方檢測到自己DSR有效之后查看自身狀態(tài)看看自己能不能接受數(shù)據(jù)秒裕,如果可以的話就通知發(fā)送方我也準(zhǔn)備好了袱蚓,通知方式和發(fā)送方一樣。這一步是串口通信最先需要進(jìn)行的几蜻。
? ? 完成了上面的步驟之后喇潘,數(shù)據(jù)接收方檢查自身緩沖區(qū)當(dāng)前狀態(tài),如果可以接受數(shù)據(jù)梭稚,就通過RTS有效告訴數(shù)據(jù)發(fā)送方可以繼續(xù)發(fā)送數(shù)據(jù)了颖低,數(shù)據(jù)接受方CTS有效。數(shù)據(jù)發(fā)送方在檢查到自己CTS有效之后弧烤,就開始將自己發(fā)送緩沖區(qū)的數(shù)據(jù)發(fā)送到串口線上忱屑。當(dāng)數(shù)據(jù)接受方發(fā)現(xiàn)自己接受緩沖區(qū)快滿了就置RTS無效,進(jìn)而控制數(shù)據(jù)發(fā)送方CTS無效暇昂,停止數(shù)據(jù)發(fā)送莺戒。
? ? 基于以上分析,從任何一個終端來看急波,如果想發(fā)送數(shù)據(jù)就檢查自己的DSR和CTS是否同時有效从铲,若有效就可以發(fā)送了。如果還可以繼續(xù)接受數(shù)據(jù)澄暮,就去置自己的DTR和RTS有效名段,告訴對面繼續(xù)發(fā)送數(shù)據(jù)吧,我這邊感覺良好泣懊。
? ? 以上是通過接線實現(xiàn)的硬件流控制伸辟。軟件流控制比較簡單,其實就是在串口發(fā)送的數(shù)據(jù)里面設(shè)置了兩個標(biāo)志馍刮,這個標(biāo)志傳輸?shù)姆较蚝蛿?shù)據(jù)傳輸?shù)姆较蛳喾醋悦洌菙?shù)據(jù)接收方通知數(shù)據(jù)發(fā)送方自己是否還可以繼續(xù)接受數(shù)據(jù)。畢竟我們前面分析了串口通信的主導(dǎo)方是數(shù)據(jù)接收方渠退。