linux串口通讯
1、串口操作头文件#include<stdio.h>/*标准输入输出定义*/#include<stdlib.h>/*标准函数库定义*/#include<unistd.h>/*Unix 标准函数定义*/#include<sys/types.h>/*数据类型,比如一些XXX_t的那种*/#include<sys/stat.h>/*定义了一些返
目录
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串口的代码

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