使用open()函數(shù)打開串口設(shè)備
首先使用open()函數(shù)打開串口設(shè)備/dev/ttymxc6,設(shè)備使用了O_RDWR | O_NOCTTY | O_NDELAY標(biāo)志,分別代表以讀寫方式打開、不讓設(shè)備成為控制終端且設(shè)置非阻塞模式,也就是當(dāng)無法打開設(shè)備時(shí),不會(huì)在原地等待,會(huì)馬上返回;
上面使用了if語句判斷文件描述符fd,如果open()返回的文件描述符<0,則代表設(shè)備打開失敗,輸出“Can't Open Serial Port /dev/ttymxc6”;
如果是其他情況,則說明設(shè)備打開成功,把設(shè)備的波特率,數(shù)據(jù)位,停止位,校驗(yàn)位打印出來;
獲取當(dāng)前配置參數(shù)
前面介紹過tcgetattr()函數(shù)的用法,在這里就是獲取上面open()函數(shù)返回的文件描述符fd作為tcgetattr()的參數(shù),然后創(chuàng)建一個(gè)termios名為oldtio來儲(chǔ)存串口舊的參數(shù)。
寫配置
程序中是對(duì)newtio結(jié)構(gòu)體中的c_cflag加上CLOCAL | CREAD,意為使驅(qū)動(dòng)程序啟動(dòng)接收字符裝置,同時(shí)忽略串口信號(hào)線的狀態(tài)。
另外對(duì)c_cflag與上了~CSIZE,即設(shè)置數(shù)據(jù)位。
清空緩沖區(qū)
使用tcflush()函數(shù)清空緩沖區(qū),避免本次將之前殘存的數(shù)據(jù)發(fā)送出去引起混亂。
配置生效
前面已經(jīng)完成了對(duì) struct termios 結(jié)構(gòu)體各個(gè)成員進(jìn)行配置,但是配置還未生效,需要將配置參數(shù)寫入到終端設(shè)備(串口硬件),使其生效。通過 tcsetattr()函數(shù)將配置參數(shù)寫入到硬件設(shè)備。
串口接收函數(shù)
使用read()函數(shù)讀緩沖區(qū)的數(shù)據(jù),即串口接收:
串口發(fā)送函數(shù)
使用write()函數(shù)發(fā)送緩沖區(qū)的數(shù)據(jù),即串口發(fā)送: