注意:學(xué)習(xí)資料可在ElfBoard官方網(wǎng)站“資料”專區(qū)獲取。
本節(jié)用到的源碼路徑:ELF 1開發(fā)板資料包->03-例程源碼->03-1 命令行例程源碼->02_elf1_cmd_serialport
serial.c
本節(jié)代碼提供了串口通信的函數(shù)庫,主要分三部分:
(一)設(shè)置串口參數(shù)'func_set_opt'
首先通過func_set_opt設(shè)置參數(shù),波特率從600 bit/s-115200 bits/s,默認(rèn)使用的是9600 bits/s;之后是校驗(yàn)位,五種校驗(yàn)方式分別為奇校驗(yàn)、偶校驗(yàn)、MARK校驗(yàn)、SPACE校驗(yàn)和空校驗(yàn);另外還有檢測是否有停止位;以及硬件連接方式是否帶RTS和CTS引腳。
(二)發(fā)送數(shù)據(jù)'func_send_frame'
串口發(fā)送函數(shù)用于向串口發(fā)送數(shù)據(jù)。該函數(shù)接收一個文件描述符 fd,指向待發(fā)送數(shù)據(jù)緩沖區(qū)的指針 p_send_buff,以及要發(fā)送數(shù)據(jù)的長度 count。函數(shù)內(nèi)部使用 write 函數(shù)將數(shù)據(jù)寫入串口,并返回寫入的字節(jié)數(shù)。
(三)串口接收'func_receive_frame'
串口接收函數(shù)用于從串口接受數(shù)據(jù)。該函數(shù)接收一個文件描述符 fd,指向接收數(shù)據(jù)緩沖區(qū)的指針 p_receive_buff,以及要接收數(shù)據(jù)的長度 count。函數(shù)內(nèi)部使用 read?函數(shù)將數(shù)據(jù)從串口讀出來,并返回實(shí)際讀到的字節(jié)數(shù)。
serial.h
(一)定義串口參數(shù)結(jié)構(gòu)體struct_tty_param,它包含以下成員變量:
baudrate:波特率,表示數(shù)據(jù)傳輸速率,取值范圍為 600 到 4000000;
data_bit:數(shù)據(jù)位,表示每個數(shù)據(jù)字節(jié)中的位數(shù),可取 5、6、7 或 8;
stop_bit:停止位,表示停止位的數(shù)量,可取 1 或 2;
check:校驗(yàn)方式,表示數(shù)據(jù)校驗(yàn)的方式??梢允?'N' 表示無校驗(yàn),'O' 表示奇校驗(yàn),'E' 表示偶校驗(yàn);
hardware:硬件流控,表示是否啟用硬件流控;
(二)聲明func_set_opt
用于設(shè)置串口參數(shù)。它傳入一個 fd,以及用于設(shè)置串口的參數(shù)值,包括速度 speed、數(shù)據(jù)位 bits、停止位 stop、校驗(yàn)方式 check 和硬件流控 hardware。函數(shù)返回執(zhí)行結(jié)果。
(三)聲明函數(shù)func_send_frame
用于向串口發(fā)送數(shù)據(jù)。它傳入一個 fd,一個指向待發(fā)送數(shù)據(jù)緩沖區(qū)的指針 p_send_buff,以及要發(fā)送的數(shù)據(jù)長度 count。函數(shù)返回執(zhí)行結(jié)果。
(四)聲明函數(shù)func_receive_frame
用于從串口接收數(shù)據(jù)。它傳入一個 fd,一個指向接收數(shù)據(jù)緩沖區(qū)的指針 p_receive_buff,以及最大接收數(shù)據(jù)長度 count。函數(shù)返回執(zhí)行結(jié)果。
主函數(shù)main.c
(一)定義了一些全局變量,包括:
(1)`ver`:存儲版本信息的字符數(shù)組;
(2)`fd`:串口文件描述符;
(3)`tty_param`:串口參數(shù)結(jié)構(gòu)體,用于存儲串口的波特率、數(shù)據(jù)位、停止位、校驗(yàn)方式和硬件流控等參數(shù);
(4)`send_buff`、`receive_buff`:發(fā)送和接收數(shù)據(jù)的緩沖區(qū);
(5)`send_num`、`receive_num`:發(fā)送和接收的數(shù)據(jù)長度;
(6)`dev`:串口設(shè)備名稱;
(二)`func_my_print`:自定義的打印函數(shù),根據(jù)指定的打印格式打印數(shù)據(jù)。
(三)`print_usage`:打印參數(shù)設(shè)置的格式說明。
(四)`get_param`:解析命令行參數(shù),并將參數(shù)值賦給串口參數(shù)結(jié)構(gòu)體 `tty_param`。
(五)`main` 函數(shù):主函數(shù),用于執(zhí)行串口通信的示例程序。
(1)首先檢查命令行參數(shù),如果沒有指定串口設(shè)備名稱或使用了幫助參數(shù),則打印使用說明并退出程序。
(2)通過命令行參數(shù)拼接串口設(shè)備名稱,并打開串口設(shè)備。
(3)調(diào)用 `get_param` 函數(shù)解析命令行參數(shù),并將參數(shù)值賦給 `tty_param`。
(4)調(diào)用 `func_set_opt` 函數(shù)設(shè)置串口參數(shù)。
(5)打印串口參數(shù)信息。
(6)進(jìn)入循環(huán),不斷發(fā)送和接收數(shù)據(jù),根據(jù)不同的模式選擇不同的操作。
(7)如果啟用了發(fā)送模式,則按照設(shè)定的時間間隔發(fā)送指定的數(shù)據(jù)。
(8)如果啟用了數(shù)據(jù)回環(huán)模式,則將接收到的數(shù)據(jù)發(fā)送回去。
(9)關(guān)閉串口。
該程序通過命令行參數(shù)來設(shè)置串口的參數(shù),并提供了發(fā)送和接收數(shù)據(jù)的功能。在主函數(shù)的循環(huán)中,可以根據(jù)需要選擇不同的操作模式,例如定時發(fā)送數(shù)據(jù)、數(shù)據(jù)回環(huán)等。
程序說明
進(jìn)程名:elf1_cmd_serialport
使用方法:./elf1_cmd_serialport 設(shè)備名 [參數(shù)選項]… …