linux 串口編程

最近學習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從網絡讀就會阻塞,至於會阻塞多長時間也是不確定的,如果一直沒有數據到達就一直阻塞在那裏。同樣,寫常規文件是不會阻塞的,而向終端設備或網絡寫則不一定。

http://read.pudn.com/downloads58/sourcecode/comm/com_port/206068/LINUX%E4%B8%8B%E7%9A%84%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1%E7%BC%96%E7%A8%8B%E4%B8%8E%E8%B0%83%E8%AF%95.pdf

(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 &= ~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;

借鑑文章http://hi.baidu.com/mcu99/item/b8aed1c6b26cf021e80f2e75

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章