DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在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;

}

posted on   DoubleLi  阅读(4610)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2013-04-14 C++开发文章收藏
点击右上角即可分享
微信分享提示