① 單片機串列通訊與並行通訊區別
單片機串列通訊與並行通訊區別
一條信息的各位數據被逐位按順序傳送的通訊方式稱為串列通訊。串列通訊的特點是:數據位傳送,傳按位順序進行,最少只需一根傳輸線即可完成,成本低但送速度慢。串列通訊的距離可以從幾米到幾千米。 根據信息的傳送方向,串列通訊可以進一步分為單工、半雙工和全雙工三種。信息只能單向傳送為單工;信息能雙向傳送但不能同時雙向傳送稱為半雙工;信息能夠同時雙向傳送則稱為全雙工。 串列通訊又分為非同步通訊和同步通訊兩種方式。在單片機中,主要使用非同步通訊方式。
串列通訊中,兩個設備之間通過一對信號線進行通訊,其中一根為信號線,另外一根為信號地線,信號電流通過信號線到達目標設備,再經過信號地線返回,構成一個信號迴路。
初級讀者會產生疑問:為何不讓信號電流從電源地線返回?答案:公共地線上存在各種雜亂的電流,可以輕而易舉地把信號淹沒。因此所有的信號線都使用信號地線而不是電源地線,以避免干擾。
這一對信號線每次只傳送1bit(比特)的信號,比如1Byte(位元組)的信號需要8次才能發完。傳輸的信號可以是數據、指令或者控制信號,這取決於採用的是何種通訊協議以及傳輸狀態。串列信號本身也可以帶有時鍾信息,並且可以通過演算法校正時鍾。因此不需要額外的時鍾信號進行控制。
並行通訊中,基本原理與串列通訊沒有區別。只不過使用了成倍的信號線路,從而一次可以傳送更多bit的信號。
並行通訊通常可以一次傳送8bit、16bit、32bit甚至更高的位數,相應地就需要8根、16根、32根信號線,同時需要加入更多的信號地線。比如傳統的PATA線路有40根線,其中有16根信號線和7根信號地線,其他為各種控制線,一次可以傳送2Byte的數據。並行通訊中,數據信號中無法攜帶時鍾信息,為了保證各對信號線上的信號時序一致,並行設備需要嚴格同步時鍾信號,或者採用額外的時鍾信號線。
通過串列通訊與並行通訊的對比,可以看出:串列通訊很簡單,但是相對速度低;並行通訊比較復雜,但是相對速度高。更重要的是,串列線路僅使用一對信號線,線路成本低並且抗干擾能力強,因此可以用在長距離通訊上;而並行線路使用多對信號線(還不包括額外的控制線路),線路成本高並且抗干擾能力差,因此對通訊距離有非常嚴格的限制。
② 單片機 通信 uart 和 modbus 有什麼區別
在單片機中uart代表的是串口通訊,是物理鏈路。
而modbus只是一個協議,在單片機中一般使用的是MODBUS -RTU要比網路的TCP/IP簡單些,MODBUS協議在工業上應用狠普遍CRC的偵錯也比較好,所以能得到廣發買的使用!
③ 單片機SPI通信協議是什麼
用I2C通信的晶元最常用的就是EEPROM晶元,如Atmel的AT24CXX系列,此外,還有一些其它功能的晶元。用SPI通信的晶元有外置FLASH晶元,同樣,還有其他功能的一些晶元。
I2C通信需要用到兩個引腳:SDA SCL。SCL是時鍾引腳,SDA是數據引腳。
SPI通信需要3個引腳或者4個引腳:CS SCK MOSI MISO。SPI通信晶元的引腳名稱不一定都是這幾個名稱,可能還有會別的名稱,但是意思是一樣的,例如MOSI引腳的意思是「主機輸出從機輸入」,某個SPI介面的晶元就有可能會寫成SDI,因為這個SPI器件是作為從機的,所以它的SDI的意思就是「從機數據輸入引腳」。
SPI通信過程為:把CS引腳拉低,然後SCK輸出時鍾,然後就可以在MOSI引腳上輸出數據,同時可以在MISO上獲得數據了。
參考資料來源:吳鑒鷹吧
貢獻文檔:網路文庫《吳鑒鷹單片機項目實戰精講》
單片機學習:吳鑒鷹單片機開發板(有詳細的視頻教程)
④ 單片機之間的通信是什麼意思
就是傳輸信息
⑤ 網路通信協議和單片機通信協議有什麼區別
i2c匯流排是內部匯流排,用來連接內部系統內的晶元。比如mcu和存儲器、鍵盤現實晶元、ad轉換等等。
串口通信是用來和系統外部的設別通信的。比如設備和設備之間通信。
i2c和串口在通信協議上可以做到一樣,也可做到不一樣,這取決與具體的情況。
mcu和2402通信,mcu和電腦通信它們之間的協議軟體可以做到完全一樣
比如mcu發送1
2402和電腦發送2。
⑥ 單片機的底層通訊協議是指什麼
你好,
就我個人理解,協議包括通訊方式和通訊內容兩個內容。
通訊方式有232,ttl,485,422,can等。
通訊內容需要你們自己決定,比如數據的首尾是什麼,中間每一位元組又代表什麼,是否需要校驗,校驗的方式又是什麼。你收到數據後是不是要回數據?如果出錯了要怎麼辦?
祝你生活愉快。
⑦ 單片機通信協議什麼幀頭啦,幀尾了,目標地址,
僅有基於物理層或者數據鏈路層的自定義協議上使用
比較經常用在基於串口通訊的自定義協議中。
串口是數據流的形式,因此需要幀頭和幀尾還需要數據包長度,以解決拆包粘包問題。
串口存在通訊不穩定數據變化丟失等問題,因此還需要添加校驗,重發等機制。
有些串口比如485通訊,採用匯流排通信,因此需要給設備編地址。
⑧ 51單片機串口通信,和I2C串口通信協議有什麼區別和相同
I2C匯流排是內部匯流排,用來連接內部系統內的晶元。比如mcu和存儲器、鍵盤現實晶元、ad轉換等等。
串口通信是用來和系統外部的設別通信的。比如設備和設備之間通信。
I2C和串口在通信協議上可以做到一樣,也可做到不一樣,這取決與具體的情況。
mcu和2402通信,mcu和電腦通信它們之間的協議軟體可以做到完全一樣
比如mcu發送1 2402和電腦發送2。
⑨ 單片機通訊協議有哪些
1、單片機與其他單片機或晶元級的通訊有:RS232、IIC、SPI、並口(I/O)、DMA(如msp430、ARM);
2、單片機通過電纜與PC或其他設備通訊有:RS232、RS485、USB、CAN、光纖、乙太網;
3、單片機遠距離傳輸通訊(超過10米):RS485、CAN、乙太網等。
⑩ 單片機中所說的通信協議是什麼
單片機通信協議
現在大部分的儀器設備都要求能過通過上位機軟體來操作,這樣方便調試,利於操作。其中就涉及到通信的過程。在實際製作的幾個設備中,筆者總結出了通信程序的通用寫法,包括上位機端和下位機端等。
1.自定義數據通信協議
這里所說的數據協議是建立在物理層之上的通信數據包格式。所謂通信的物理層就是指我們通常所用到的RS232、RS485、紅外、光纖、無線等等通信方式。在這個層面上,底層軟體提供兩個基本的操作函數:發送一個位元組數據、接收一個位元組數據。所有的數據協議全部建立在這兩個操作方法之上。
通信中的數據往往以數據包的形式進行傳送的,我們把這樣的一個數據包稱作為一幀數據。類似於網路通信中的TCPIP協議一般,比較可靠的通信協議往往包含有以下幾個組成部分:幀頭、地址信息、數據類型、數據長度、數據塊、校驗碼、幀尾。
幀頭和幀尾用於數據包完整性的判別,通常選擇一定長度的固定位元組組成,要求是在整個數據鏈中判別數據包的誤碼率越低越好。減小固定位元組數據的匹配機會,也就是說使幀頭和幀尾的特徵位元組在整個數據鏈中能夠匹配的機會最小。通常有兩種做法,一、減小特徵位元組的匹配幾率。二、增加特徵位元組的長度。通常選取第一種方法的情況是整個數據鏈路中的數據不具有隨即性,數據可預測,可以通過人為選擇幀頭和幀尾的特徵字來避開,從而減小特徵位元組的匹配幾率。使用第二種方法的情況更加通用,適合於數據隨即的場合。通過增加特徵位元組的長度減小匹配幾率,雖然不能夠完全的避免匹配的情況,但可以使匹配幾率大大減小,如果碰到匹配的情況也可以由校驗碼來進行檢測,因此這種情況在絕大多說情況下比較可靠。
地址信息主要用於多機通信中,通過地址信息的不同來識別不同的通信終端。在一對多的通信系統中,可以只包含目的地址信息。同時包含源地址和目的地址則適用於多對多的通信系統。
數據類型、數據長度和數據塊是主要的數據部分。數據類型可以標識後面緊接著的是命令還是數據。數據長度用於指示有效數據的個數。
校驗碼則用來檢驗數據的完整性和正確性。通常對數據類型、數據長度和數據塊三個部分進行相關的運算得到。最簡單的做法可是對數據段作累加和,復雜的也可以對數據進行CRC運算等等,可以根據運算速度、容錯度等要求來選取。
2.上位機和下位機中的數據發送
物理通信層中提供了兩個基本的操作函數,發送一個位元組數據則為數據發送的基礎。數據包的發送即把數據包中的左右位元組按照順序一個一個的發送數據而已。當然發送的方法也有不同。
在單片機系統中,比較常用的方法是直接調用串口發送單個位元組數據的函數。這種方法的缺點是需要處理器在發送過程中全程參與,優點是所要發送的數據能夠立即的出現在通信線路上,能夠立即被接收端接收到。另外一種方法是採用中斷發送的方式,所有需要發送的數據被送入一個緩沖區,利用發送中斷將緩沖區中的數據發送出去。這種方法的優點是佔用處理器資源小,但是可能出現需要發送的數據不能立即被發送的情況,不過這種時延相當的小。對於51系列單片機,比較傾向於採用直接發送的方式,採用中斷發送的方式比較佔用RAM資源,而且對比直接發送來說也沒有太多的優點。以下是51系列單片機中發送單個位元組的函數。
void SendByte(unsigned char ch)
{
SBUF = ch;
while(TI == 0);
TI = 0;
}
上位機中關於串口通信的方式也有多種,這種方式不是指數據有沒有緩沖的問題,而是操作串口的方式不同,因為PC上數據發送基本上都會被緩沖後再發送。對於編程來說操作串口有三種方式,一、使用windows系統中自帶的串口通信控制項,這種方式使用起來比較簡單,需要注意的是接收時的阻塞處理和線程機制。二、使用系統的API直接進行串口數據的讀取,在windows和linux系統中,設備被虛擬為文件,只需要利用系統提供的API函數即可進行串口數據的發送和讀取。三、使用串口類進行串口操作。在此只介紹windows環境下利用串口類編程的方式。
CSerialPort是比較好用的串口類。它提供如下的串口操作方法:
void WriteToPort(char* string, int len);
串口初始化成功後,調用此函數即可向串口發送數據。為了避免串口緩沖所帶來的延時,可以開啟串口的沖刷機制。
3.下位機中的數據接收和協議解析
下位機接收數據也有兩種方式,一、等待接收,處理器一直查詢串口狀態,來判斷是否接收到數據。二、中斷接收。兩種方法的優缺點在此前的一篇關於串口通信的文章中詳細討論過。得出的結論是採用中斷接收的方法比較好。
數據包的解析過程可以設置到不同的位置。如果協議比較簡單,整個系統只是處理一些簡單的命令,那麼可以直接把數據包的解析過程放入到中斷處理函數中,當收到正確的數據包的時候,置位相應的標志,在主程序中再對命令進行處理。如果協議稍微復雜,比較好的方式是將接收的數據存放於緩沖區中,主程序讀取數據後進行解析。也有兩種方式交叉使用的,比如一對多的系統中,首先在接收中斷中解析「連接」命令,連接命令接收到後主程序進入設置狀態,採用查詢的方式來解析其餘的協議。
以下給出具體的實例。在這個系統中,串口的命令非常簡單。所有的協議全部在串口中斷中進行。數據包的格式如下:
0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D
其中0x55, 0xAA, 0x7E為數據幀的幀頭,0x0D為幀尾,0x12為設備的目的地址,0xF0為源地址,0x02為數據長度,後面接著兩個數據0x23, 0x45,從目的地址開始結算累加、異或校驗和,到數據的最後一位結束。
協議解析的目的,首先判斷數據包的完整性,正確性,然後提取數據類型,數據等數據,存放起來用於主程序處理。代碼如下:
if(state_machine == 0) // 協議解析狀態機
{
if(rcvdat == 0x55) // 接收到幀頭第一個數據
state_machine = 1;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 1)
{
if(rcvdat == 0xAA) // 接收到幀頭第二個數據
state_machine = 2;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 2)
{
if(rcvdat == 0x7E) // 接收到幀頭第三個數據
state_machine = 3;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 3)
{
sumchkm = rcvdat; // 開始計算累加、異或校驗和
xorchkm = rcvdat;
if(rcvdat == m_SrcAdr) // 判斷目的地址是否正確
state_machine = 4;
else
state_machine = 0;
}
else if(state_machine == 4)
{
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(rcvdat == m_DstAdr) // 判斷源地址是否正確
state_machine = 5;
else
state_machine = 0;
}
else if(state_machine == 5)
{
lencnt = 0; // 接收數據計數器
rcvcount = rcvdat; // 接收數據長度
sumchkm += rcvdat;
xorchkm ^= rcvdat;
state_machine = 6;
}
else if(state _machine == 6 || state _machine == 7)
{
m_ucData[lencnt++] = rcvdat; // 數據保存
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(lencnt == rcvcount) // 判斷數據是否接收完畢
state_machine = 8;
else
state_machine = 7;
}
else if(state_machine == 8)
{
if(sumchkm == rcvdat) // 判斷累加和是否相等
state_machine = 9;
else
state_machine = 0;
}
else if(state_machine == 9)
{
if(xorchkm == rcvdat) // 判斷異或校驗和是否相等
state_machine = 10;
else
state_machine = 0;
}
else if(state_machine == 10)
{
if(0x0D == rcvdat) // 判斷是否接收到幀尾結束符
{
retval = 0xaa; // 置標志,表示一個數據包接收到
}
state_machine = 0; // 復位狀態機
}
此過程中,使用了一個變數state_machine作為協議狀態機的轉換狀態,用於確定當前位元組處於一幀數據中的那個部位,同時在接收過程中自動對接收數據進行校驗和處理,在數據包接收完的同時也進行了校驗的比較。因此當幀尾結束符接收到的時候,則表示一幀數據已經接收完畢,並且通過了校驗,關鍵數據也保存到了緩沖去中。主程序即可通過retval的標志位來進行協議的解析處理。
接收過程中,只要哪一步收到的數據不是預期值,則直接將狀態機復位,用於下一幀數據的判斷,因此系統出現狀態死鎖的情況非常少,系統比較穩定,如果出現丟失數據包的情況也可由上位機進行命令的補發,不過這種情況筆者還沒有碰到。
對於主程序中進行協議處理的過程與此類似,主程序循環中不斷的讀取串口緩沖區的數據,此數據即參與到主循環中的協議處理過程中,代碼與上面所述完全一樣。
4.上位機中的數據接收和命令處理
上位機中數據接收的過程與下位機可以做到完全一致,不過針對不同的串口操作方法有所不同。對於阻賽式的串口讀函數,例如直接進行API操作或者調用windows的串口通信控制項,最好能夠開啟一個線程專門用於監視串口的數據接收,每接收到一個數據可以向系統發送一個消息。筆者常用的CSerialPort類中就是這樣的處理過程。CSerialPort打開串口後開啟線程監視串口的數據接收,將接收的數據保存到緩沖區,並向父進程發送接收數據的消息,數據將隨消息一起發送到父進程。父進程中開啟此消息的處理函數,從中獲取串口數據後就可以把以上的代碼拷貝過來使用。
CSerialPort向父類發送的消息號如下:
#define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.
因此需要手動添加此消息的響應函數:
afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);
ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
響應函數的具體代碼如下:
LONG CWellInfoView::OnCommunication(WPARAM ch, LPARAM port)
{
int retval = 0;
rcvdat = (BYTE)ch;
if(state_machine == 0) // 協議解析狀態機
{
if(rcvdat == 0x55) // 接收到幀頭第一個數據
state_machine = 1;
else
state_machine = 0; // 狀態機復位
}
else if(state_machine == 1)
{
if(rcvdat == 0xAA) // 接收到幀頭第二個數據
state_machine = 2;
else
state_machine = 0; // 狀態機復位
......
5.總結
以上給出的是通信系統運作的基本雛形,雖然簡單,但是可行。實際的通信系統中協議比這個要復雜,而且涉及到數據包響應、命令錯誤、延時等等一系列的問題,在這樣的一個基礎上可以克服這些困難並且實現出較為穩定可靠的系統