標籤:
1、串口通訊原理
串口通訊定義
串口通訊:資料的串列傳送方式。串口通訊可分為同步通訊與非同步通訊。
同步通訊:按照軟體識別同步字元來實現資料的發送和接收。
- 將許多字元組成一個資訊組進行發送
- 要求發送時鐘和接收時鐘保持嚴格的同步
- 效率相對高,對雙發時鐘的誤差要求也高
非同步通訊:利用字元的再同步技術的通訊方式。
- 按字元一個一個進行傳輸
- 每傳輸一個字元,就用起始位來通知對方,以此來重新核對收發雙方同步
- 可靠性較高,但效率較低
同步通訊按幀為單位傳輸,非同步通訊按字元為單位傳輸。(資料連結層)
9針串口管腳布局
串口通訊重要參數:
傳輸速率、資料位元、停止位、同位
串口通訊的測試:
串連com1和com2兩個串口,在/dev/ttyS0裝置檔案中寫入資料“Hello”,然後看/dev/ttyS1裝置檔案。串口裝置可以使用read/write直接存取。
ttyS0對應com1,ttyS1對應com2。
2、串口編程常用的API
串口參數設定
串口編程需要用到的標頭檔
1 #include <stdio.h> /*標準輸入輸出*/2 #include <stdlib.h> /*標準函數庫*/3 #include <unistd.h> /*Unix標準函數定義*/4 #include <sys/types.h> /*定義資料類型*/5 #include <sys/stat.h> /*定義狀態相關的資料類型*/6 #include <fcntl.h> /*檔案控制定義*/7 #include <termios.h> /*POSIX終端控制定義*/8 #include <errno.h> /*錯誤號碼定義*/9 #include <string.h> /*字串功能函數*/
傳輸速率的設定
cfsetispeed() 設定輸入連接埠的傳輸速率
cfsetospeed() 設定輸出連接埠的傳輸速率
cfgetispeed() 擷取輸入連接埠的傳輸速率
cfgetospeed() 擷取輸出連接埠的傳輸速率
struct termios opt; 定義指向termios結構的指標opt
termios結構體
#define NCCS 19struct termios{ tcflag_t c_iflag; //輸入參數 tcflag_t c_oflag; //輸出參數 tcflag_t c_cflag; //控制參數 tcflag_t c_ispeed; //輸入傳輸速率 tcflag_t c_ospeed; //輸出傳輸速率 cc_t c_line; //線控制 cc_t c_cc[NCCS]; //控制字元};
傳輸速率設定執行個體
cfsetispeed(&opt, B9600); //指定輸入傳輸速率為9600bpscfsetospeed(&opt, B9600);
串口常見操作
fd=open("/dev/ttyS0", O_RDWR | O_NOCTTY);
int read(int fd, *buffer, length);
int write(int fd, *buffer, length);
int close(int fd);
串口控制流程程
- 設定傳輸速率
- 校正位和停止位的設定
- 開啟串口
- 發送串口資料
- 讀取串口資料
- 關閉串口
3、串口編程實踐
4、Modbus協議介紹
屬於應用程式層協議,用於電子控制器進行控制和通訊的通訊協議。通過此程式,控制器相互之間、控制器經由網路和器它裝置之間可以進行通訊。
ModBus的兩種常用傳輸模式:
ASCLL模式:在訊息中的每個8Bit位元組都作為兩個ASCLL字元發送,字元發送的時間間隔可達到1秒而不產生錯誤。
RTU模式:在同樣的傳輸速率下,可比ASCLL方式傳送更多的資料。(更為常用一些)
兩種模式的比較
功能代碼位
例:ModBus一個執行個體
發送指令: 01 04 00 28 00 02 F1 C3
<slave address 1 Byte><Function 1 Byte><Start Address 2 Bytes><NumberofBytes 2 Bytes><Checksum 2 Bytes>
接收回複: 01 04 04 42 0B 99 9A 74 05
<slave address 1 Byte><Function 1 Byte><NumberofBytes 1 Bytes><DataIEEE32 x Byte><Checksum 2 Bytes>
ModBus通訊協定的通訊方式
5、Modbus編程實踐
Linux下串口與工業協議的開發