最近學習linux串口編程,總結一下遇到的一些問題
(1)write(fd,"xxxx",len)每次發送都沒有接收到,主要問題字符串後面加 回車 即“\n”
(2)主要問題就是 阻塞和非阻塞的問題
read函數
ssize_t read(int fd, void *buf, size_t count);
參數:
fd: 將要讀取數據的文件描述詞。
buf: 所讀取到的數據的內存緩衝。
count: 需要讀取的數據量。
返回說明:
成功執行時,返回所讀取的數據量。失敗返回-1,errno被設爲以下的某個值
EAGAIN:打開文件時設定了O_NONBLOCK標誌,並且當前沒有數據可讀取
EBADF:文件描述詞無效,或者文件不可讀
EFAULT:參數buf指向的空間不可訪問
EINTR:數據讀取前,操作被信號中斷
EINVAL:一個或者多個參數無效
EIO:讀寫出錯
EISDIR:參數fd索引的時目錄
write函數:函數向打開的設備或文件中寫數據。
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); 返回值:成功返回寫入的字節數,出錯返回-1並設置errno
寫常規文件時,
write的返回值通常等於請求寫的字節數count,而向終端設備或網絡寫則不一定。讀常規文件是不會阻塞的,不管讀多少字節read一定會在有限的時間內返回。從終端設備或網絡讀則不一定,如果從終端輸入的數據沒有換行符,調用read讀終端設備就會阻塞,如果網絡上沒有接收到數據包,調用read從網絡讀就會阻塞,至於會阻塞多長時間也是不確定的,如果一直沒有數據到達就一直阻塞在那裏。同樣,寫常規文件是不會阻塞的,而向終端設備或網絡寫則不一定。
(3)串口有時可以接收到數據,有時接收不到:
我發現只要你打開過minicom 然後你的程序就可以接收了,你退出minicom就可以。但是你電腦重啓後就會失敗,後來找到了解決辦法,運行過一次minicom這三種情況下使用命令stty -a < /dev/ttyS0查看了COM1的相關參數。然後主要根據自己的讀取程序和minicom對串口的設置差異進行了相應的修改,現將讀取程序的全部貼在下面。經過修改後,該程序運行之後的/dev/ttyS4的環境參數與直接運行minicom後/dev/ttyS4的環境參數完全相同
主要修改處:
options.c_cflag &= ~HUPCL;
options.c_iflag &= ~INPCK;
options.c_iflag |= IGNBRK;
options.c_iflag &= ~ICRNL;
options.c_iflag &= ~IXON;
options.c_lflag &= ~IEXTEN;
options.c_lflag &= ~ECHOK;
options.c_lflag &= ~ECHOCTL;
options.c_lflag &= ~ECHOKE;
options.c_oflag &= ~ONLCR;
options.c_iflag |= IGNBRK;
options.c_iflag &= ~ICRNL;
options.c_iflag &= ~IXON;
options.c_lflag &= ~IEXTEN;
options.c_lflag &= ~ECHOK;
options.c_lflag &= ~ECHOCTL;
options.c_lflag &= ~ECHOKE;
options.c_oflag &= ~ONLCR;