嵌入式linux串口设置(一)

简介: 在linux中,所有的设备文件一般都位于“/dev”下,串口1和串口2对应的设备名依次为“/dev/ttyS0”, “/dev/ttyS1”,而且USB转串口的设备名通常为“/dev/ttyUSB0”,在linux下对设备的操作方法与对文件的操作方法一样。

在linux中,所有的设备文件一般都位于“/dev”下,串口1和串口2对应的设备名依次为“/dev/ttyS0”, “/dev/ttyS1”,而且USB转串口的设备名通常为“/dev/ttyUSB0”,在linux下对设备的操作方法与对文件的操作方法一样。

串口开发步骤:

串口的设置主要是设置struct termios结构体的各成员值

#include<termios>

struct termios

{

       Unsigned short c_iflag;            /*输入模式标志*/

       Unsigned short c_oflag;           /*输出模式标志*/

       Unsigned short c_cflag;           /*控制模式标志*/

       Unsigned short c_lflag;            /*本地模式标志*/

       Unsigned char c_line ;             /*线路规则*/

       Unsigned char c_cc[NCC];              /*控制特性*/

      Speed_t        c_ispeed;             /*输入速度*/

     Speed_t        c_ospeed;            /*输出速度*/

};

串口设置包括波特率设置,检验位和停止位设置,主要设置的是c_cflag结构体成员,注意,不能直接对c_cflag成员初始化,而要将其通过与或操作。

 

 

int set_com_config(int fd,int baud_rate, int data_bits,char parity,int stop_bits)

{

       struct termios new_cfg,old_cfg;

       int speed;

      

       /*保存并测试现有串口参数设置,在这里如果串口号等出错,会有相关出错信息*/

       if(tcgetattr(fd,&old_cfg) != 0)        /*该函数得到fd指向的终端配置参数,并将它们保存到old_cfg变量中,成功返回0,否则-1*/

       {

              perror("tcgetttr");

              return -1;

       }

      

       /*设置字符大小*/

       new_cfg=old_cfg;

       cfmakeraw(&new_cfg);    /*配置为原始模式*/

       new_cfg.c_cflag &= ~CSIZE;/*用位掩码清空数据位的设置*/

      

       /*设置波特率*/

       switch(baud_rate)

       {

              case 2400:

                            speed=B2400;

                            break;

           case 4800:

                            speed=B4800;

                            break;

              case 9600:

                            speed=B9600;

                            break;   

              case 19200:

                            speed=B19200;

                            break;                        

              case 38400:

                            speed=B38400;

                            break;

              default:

              case 115200:

                            speed=B115200;

                            break;

       }

       cfsetispeed(&new_cfg,speed);

       cfsetospeed(&new_cfg,speed);

      

       /*设置停止位*/

       switch(data_bits)

       {

              case 7:

                            new_cfg.c_cflag |= CS7;

                            break;

              default:

              case 8:

                            new_cfg.c_cflag |= CS8;

                            break;

       }

      

       /*设置奇偶校验位*/

       switch(parity)

       {

              default:

              case 'n':

              case 'N':

              {

                     new_cfg.c_cflag &= ~PARENB;

                     new_cfg.c_iflag &= ~INPCK;

              }

              break;

              case 'o':

              case 'O':

              {

                     new_cfg.c_cflag |= (PARODD | PARENB);

                     new_cfg.c_iflag |= INPCK;

              }

              break;

              case 'e':

              case 'E':

              {

                     new_cfg.c_cflag |=  PARENB;

                     new_cfg.c_cflag &= ~PARODD;

                     new_cfg.c_iflag |= INPCK;

              }

              break;

             

       }

      

       /*设置停止位*/

       switch(stopbits)

       {

              default:

              case 1:

                            new_cfg.c_cflag &= ~CSTOPB;

                            break;

              case 2:

                            new_cfg.c_cflag |= CSTOPB;

                            break;

       }

      

       /*设置等待时间和最小接收字符*/

       new_cfg.c_cc[VTIME]=0;

       new_cfg.c_cc[VMIN]=1;

      

       /*处理未接收字符*/

       tcflush(fd,TCIFLUSH);

      

       /*激活新配置*/

       if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)

       {

              perror("tcsetattr");

              return -1;

       }

       return 0;

}

目录
相关文章
|
1天前
|
存储 安全 Linux
|
5天前
|
Linux Apache
Linux设置开机启动
以上步骤允许您在Linux系统上配置开机启动服务或程序。确保将"service-name"替换为实际要配置的服务或程序的名称。
10 0
|
5天前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
该文指出了学习嵌入式Linux开发的两个常见误区。一是过分专注于学习桌面或服务器版Linux,而非关注嵌入式开发本身,实际上只需熟悉基本操作即可。二是试图在没有基础的情况下直接阅读Linux内核源代码,这是不切实际的,应先建立基础知识再进行源码学习。文章还提到了在嵌入式系统中获取和处理屏幕数据的示例,包括使用gsnap工具将framebuffer数据转为图像,以及涉及的交叉编译过程。
9 0
|
7天前
|
存储 Linux Shell
【进厂修炼 - Second week】Linux服务及用户设置
【进厂修炼 - Second week】Linux服务及用户设置
|
10天前
|
Linux Shell 开发工具
linux如何设置服务自启
linux如何设置服务自启
17 0
|
12天前
|
存储 Linux 网络安全
|
13天前
|
Ubuntu Linux
Linux(22) Linux设置网络优先级顺序
Linux(22) Linux设置网络优先级顺序
9 0
|
14天前
|
Java Linux 开发工具
手把手教你Linux查找Java的安装目录并设置环境变量以及Linux下执行javac未找到命令的保姆级教学
手把手教你Linux查找Java的安装目录并设置环境变量以及Linux下执行javac未找到命令的保姆级教学
9 0
|
17天前
|
网络协议 Linux Docker
linux白名单设置
linux白名单设置
|
20天前
|
Linux 编译器 测试技术
嵌入式 Linux 下的 LVGL 移植
嵌入式 Linux 下的 LVGL 移植