目录

1、串口操作头文件

2、串口设备

3、打开串口

3、设置串口

4、读写串口

5、关闭串口


1、串口操作头文件

#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix 标准函数定义*/
#include     <sys/types.h>  /*数据类型,比如一些XXX_t的那种*/
#include     <sys/stat.h>   /*定义了一些返回值的结构*/
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX 终端控制定义*/
#include     <errno.h>      /*错误号定义*/

2、串口设备

        在Linux下串口文件是位于/dev下。Jetson Xavier NX下,串口映射关系如下:

        UART2对应的是:/dev/ttyTHS0

        UART3对应的是:/dev/ttyTHS1

3、打开串口

        打开串口是通过使用标准的文件打开函数操作:

int fd; 
fd = open("/dev/ttyTHS0", O_RDWR|O_NOCTTY|O_NDELAY);
if(fd == -1)
{	
    perror("Can't Open Serial Port");  
    return -1;  
}  

        其中,open函数头文件为:<fcntl.h>;perror函数头文件为:<stdio.h>。

open函数原型为:

        int open(const char *__file, int __oflag, ...)

        *__file为设备地址,__oflag为标志,读写,无延迟。

完整的设备打开逻辑如下:

int Open_Device(void)  
{  
    int fd; 
    fd = open("/dev/ttyTHS0",O_RDWR|O_NOCTTY|O_NDELAY);
    if(fd == -1)
    {  
        perror("Can't Open Serial Port");  
        return -1;  
    }    
  
    if(fcntl(fd,F_SETFL,0) < 0)
    {  
        printf("fcntl failed\n");  
    }else{ 
		printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));  
    }  
  
    if(isatty(STDIN_FILENO) == 0)
    {  
        printf("standard input is not a terminal device\n");  
    }else{  
        printf("isatty sucess!\n");  
    }  

    printf("fd-open=%d\n",fd);  
    return fd;  
}

        返回串口句柄。

3、设置串口

        最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。

struct termio
{   
    unsigned short  c_iflag;     /* 输入模式标志 */ 
    unsigned short  c_oflag;     /* 输出模式标志 */ 
    unsigned short  c_cflag;     /* 控制模式标志*/  
    unsigned short  c_lflag;     /* local mode flags */  
    unsigned char    c_line;     /* line discipline */
    unsigned char    c_cc[NCC];  /* control characters */
};

        波特率设置:

struct  termios Opt;
tcgetattr(fd, &Opt);  /*获得当前设备模式,与终端相关的参数。fd=0标准输入*/
cfsetispeed(&Opt,B19200);  /*设置结构termios输入波特率为19200Bps*/
cfsetospeed(&Opt,B19200);  /*fd应该是文件描述的意思*/
tcsetattr(fd,TCANOW,&Opt);  /*设置终端参数,TCANOW修改立即发生*/
tcflush(fd, TCIOFLUSH);   /*设置前flush   

        效验位和停止位的设置:

无效验

8位

Option.c_cflag &= ~PARENB;

Option.c_cflag &= ~CSTOPB;

Option.c_cflag &= ~CSIZE;

Option.c_cflag |= ~CS8;

奇效验(Odd)

7位

Option.c_cflag |= ~PARENB;

Option.c_cflag &= ~PARODD;

Option.c_cflag &= ~CSTOPB;

Option.c_cflag &= ~CSIZE;

Option.c_cflag |= ~CS7;

偶效验(Even)

7位

Option.c_cflag &= ~PARENB;

Option.c_cflag |= ~PARODD;

Option.c_cflag &= ~CSTOPB;

Option.c_cflag &= ~CSIZE;

Option.c_cflag |= ~CS7;

Space效验

7位

Option.c_cflag &= ~PARENB;

Option.c_cflag &= ~CSTOPB;

Option.c_cflag &= &~CSIZE;

Option.c_cflag |= CS8;

        如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:

options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
options.c_oflag  &= ~OPOST;   /*Output*/

4、读写串口

        设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。

发送数据:

char  buffer[1024];
int    Length;
int    nByte;
nByte = write(fd, buffer ,Length)

读取串口数据:

        使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。

char  buff[1024];
int    Len;
int  readByte = read(fd,buff,Len);

5、关闭串口

        关闭串口就是关闭文件。不用串口了,记得关闭。串口不能同时被多次打开。

close(fd);

参考文章:

1、Linux下读写UART串口的代码

https://blog.csdn.net/u010388659/article/details/81206370

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐