《Linux串口编程分析.doc》由会员分享,可在线阅读,更多相关《Linux串口编程分析.doc(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux串口编程分析这个话题,大家可能再熟悉不过了,网上资料很多,因为这是linux下编程比较重要的一个方面,懂这方面的人很多;这里我只是想给初学者简单的介绍下这方面的知识:串口编程其实说白了, 是拿根串口线把电脑和所要控制的机器连接起来,然后在通过编程的方式对下位机进行发送指定的数据或进行控制,或进行传输,然后在接受下位机反馈回来的信息提示是否已经正确。是不是好俗!串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,当然,除了RS232 ,还有RS485和RS422两种规格,用于不同的设备通信;这里主要是介绍RS232串口编程。在串口编程中, 比较重要的是串
2、口的设置,我们要设置的部分包括 波特率,数据位,停止位,奇偶校验位;要注意的是,每台机器的串口默认设置可能是不同的,如果你没设置这些,仅仅按照默认设置进行发送数据,很可能出现n 多异想不到而又查不出来的情况;所以,在真正通讯前,我们必须设置这些:下面就开始介绍这些基本设置的函数,(其实都是些固定框架,程序中稍微改改就行)o1.设置波特率注 意每台机器都有输出和输入接受信息的速度 ,所以用cfsetispeed 和cfsetospeed来分别设置;注意到struct termios 这样一个结构,它包括了串口端所有的设置,下面还要用到。它在termios.h中被定义。还有一个地方比较难以理解,为
3、什么设置了speed_arr 和name_arr两个数组,这是因为在linuxe下,系统为波特率专门准备了一张表用B38400,B19200.代替,而我们实际上传进 去的只能是38400,19200这些值,所以我们拿我们传进去的和name_arr进行比较,如果相等则从系统对照表中取出相应值进行设置,如果不等证 明传的值在系统对照表中没有,则不进行设置。 int speed_arr = B38400, B19200, B9600, B4800, B2400, B1200, B300,/B38400, B19200, B9600, B4800, B2400, B1200, B300, ;int n
4、ame_arr = 38400,19200,9600,4800,2400,1200,300,38400,19200,9600, 4800, 2400, 1200,300, ;void set_speed(int fd, int speed)int i;int status;struct termios Opt; /定义了这样一个结构tcgetattr(fd, &Opt); /用来得到机器原端口的默认设置for ( i= 0;i 0)set_speed(fd,19200); /打开后设置波特率19200elseprintf(Cant Open Serial Port!n);exit(0);if
5、(set_Parity(fd,8,1,N)= FALSE) /设置8,1,n 注意,这里和上面要和下位机相符才可能通信printf(Set Parity Errorn);exit(1);/ 一般读的时候一般都用read ,写的时候一般都用write,read要注意阻塞后程序停止不动,所以要用select 进行控制,注意tv每次循环都要设置;write 不用考虑阻塞,但要用循环写方式保证一定写完,其实读最好也用循环读方式保证一定能读到所有东西并且能拼接在一起,然后在进行其他操作。最后while (1) 是串口通讯中常用的循环就是一直执行,直到碰到break;这些东西挺烦琐,不过其实也没什么。这里就不详细说了,下面是个最最简单的。while(1) while(nread = read(fd,buff,512)0)printf(nLen %dn,nread);buffnread+1=0;printf(n%s,buff);/close(fd);/exit(0);
限制150内