关于linux串口编程的一点总结

来源:互联网 发布:java dom4j生成xml 编辑:程序博客网 时间:2024/05/16 05:06


在linux串口编程中串口编程主要是涉及到一个结构体的配置
我们在头文件中需要包含<termios.h>这个文件,这个文件中定义了这样termios结构体,这个结构包含了至少下列成员:
struct termios
{
     tcflag_t c_iflag;      /* 输入模式 */
     tcflag_t c_oflag;      /* 输出模式 */
     tcflag_t c_cflag;      /* 控制模式 */
     tcflag_t c_lflag;      /* 本地模式 */
     cc_t c_cc[NCCS];       /* 控制字符 */
}
另外这里面包含了一下常用函数:
int tcgetattr(int fd, struct termios *termios_p);//获取当前配置
int tcsetattr(int fd, int optional_actions, struct termios *termios_p);//设置串口配置
int tcflush(int fd, int queue_selector); //清空缓冲区
speed_t cfgetispeed(struct termios *termios_p); //获取当前串口输入波特率
speed_t cfgetospeed(struct termios *termios_p); //获取当前串口输出波特率
int cfsetispeed(struct termios *termios_p, speed_t speed); //设置输入波特率
int cfsetospeed(struct termios *termios_p, speed_t speed); //设置输出波特率
tcsetattr(STDIN_FILENO,TCSAFLUSH,&termios)//激活配置

相应的结构体配置可以参考http://blog.csdn.net/TaiJi1985/article/details/1609217。

串口的配置过程
1.打开串口 open()函数,打开设备文件就可以 与普通文件相同
2.设置串口,填写termios结构体成员的配置
3.激活配置tcsetattr(STDIN_FILENO,TCSAFLUSH,&termios)
4.读写串口 read(),write()函数,如普通文件读写就可以
5.关闭串口 close(fd)关闭文件

如果遇到收不到数据的情况可以参考一下代码:
软件:newcfg.c_iflag &= ~ (IXON | IXOFF | IXANY);
硬件:newcfg.c_cflag &=~CRTSCTS;

这时候发现开发板还是收不到数,但是呢,将开发板上串口的2,3脚短接后自收自发是可以实现的。然后这个问题想了好多办法,结果发现在串口调试助手发数的时候打一个回车发出去的时候,开发板就能接收到了,我又看了看关于c_iflag与c_lflag的配置信息,这是因为串口默认输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的。此时应转换到行方式输入,不经处理直接发送,设置如下:
newcfg.c_lflag &= ~ (ICANON | ECHO | ECHOE | ISIG);
同时对串口来说,回车和换行默认是相同的字符,所以我们还需要将NL-CR的映射给屏蔽掉,设置如下:
newcfg.c_iflag &= ~ (INLCR | ICRNL | IGNCR);

注意事项:
1.注意串口对应的设备文件 在PC上 如果用USB转接线 应该是"/dev/ttyUSB0"一类的,如果不用转接线 是"/dev/ttyS0";在mini2440上为"/dev/ttySAC0"格式的。
2.由于开发板上串口只连了TXD RXD GND三条线,所以在配置时将流控制屏蔽掉。
3.注意标准模式收发的问题,不配置好会出现发送端没有回车 接收端接收不到的情况。
4.在接收时由于没有流控制限制,我们应该sleep()一段时间,否则串口接收到的数据会断开显示。

原创粉丝点击