linux 串口编程

来源:互联网 发布:怎么做软件 编辑:程序博客网 时间:2024/05/27 21:03

最近学习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

原创粉丝点击