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