深度学习Linux C语言串口编程代码解析 (linux c语言串口程序代码)

近年来,随着技术的快速发展,深度学习技术在各个领域中有着广泛的应用。而在深度学习应用过程中,很多时候需要与其他硬件进行通信,其中串口通信是一种常见的方式。本文将着重介绍Linux C语言串口编程代码的实现方法和注意事项。

一、串口通信基础知识

串口通信是指通过串行接口(Serial Port)将数据传输到计算机或其他设备上。串口通信包括两个方面:串口发送和串口接收,分别对应数据的发送和接收。

在C语言中进行串口编程,需要使用到Linux下的一些API函数,包括open、close、read、write、ioctl等,下面将对这些函数进行简单介绍。

(1)open函数

函数原型为:

“`

int open(const char *pathname, int flags);

“`

作用是打开一个文件或者设备,成功打开后返回一个文件描述符,否则返回-1。

在串口编程中,pathname参数指定了串口的设备文件名,比如/dev/ttyUSB0等。

flags参数则是一些选项组成的位掩码,包括O_RDON表示以只读方式打开设备,O_WRON表示以只写方式打开设备,O_RDWR表示以读写方式打开设备,O_NONBLOCK表示以非阻塞方式打开设备等等。

(2)close函数

函数原型为:

“`

int close(int fd);

“`

作用是关闭指定的文件或设备。其中fd参数指定了要关闭的文件描述符。

(3)read函数

函数原型为:

“`

ssize_t read(int fd, void *buf, size_t count);

“`

作用是从串口中读取数据,将读取到的数据存到buf中,最多读取count字节。函数返回实际读取的字节数,如果返回0则表示读到了文件末尾,如果返回-1则表示出现了错误。

(4)write函数

函数原型为:

“`

ssize_t write(int fd, const void *buf, size_t count);

“`

作用是将数据写入到串口中,其中fd参数指定了要写入数据的文件描述符,buf参数指定了要写入的数据缓冲区,count参数指定了要写入的字节数。函数返回实际写入的字节数,如果返回-1则表示出现了错误。

(5)ioctl函数

函数原型为:

“`

int ioctl(int fd, unsigned long request, …);

“`

作用是通过请求码request来控制设备的各种参数。其中fd参数指定了要控制的设备的文件描述符,request参数则指定了要进行的操作,后面的可变参数则表示一些参数值。

在串口编程中,比较常用的操作包括B9600、B115200、CS8、CLOCAL、CREAD等。其中,B9600表示串口波特率为9600,B115200表示串口波特率为115200,CS8表示发送8位数据,CLOCAL表示忽略调制解调器信号线路,CREAD表示启动接收器。

二、串口编程实现

现在我们来看具体的串口编程实现步骤。我们需要打开串口设备文件,可以使用如下代码:

“`

int fd = open(“/dev/ttyUSB0”, O_RDWR | O_NOCTTY | O_NDELAY);

if (fd

perror(“open fled”);

return -1;

}

“`

在上面的代码中,使用O_RDWR选项表示以读写方式打开串口设备,O_NOCTTY选项表示不将端口设成控制终端,O_NDELAY选项表示不关心DCD信号线上的信号,即可以忽略调制解调器的控制。

接下来,需要对串口相关参数进行配置。需要将文件描述符以串口设备的方式打开:

“`

struct termios options;

tcgetattr(fd, &options); //获取串口参数

cfsetispeed(&options, B115200); //波特率

cfsetospeed(&options, B115200);

options.c_cflag |= CS8; //发送8位数据

options.c_cflag &= ~PARENB; //不使用奇偶校验

options.c_cflag &= ~CSTOPB; //一位停止位

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //关闭规范模式,禁止回显

options.c_cc[VTIME] = 0; //非阻塞

options.c_cc[VMIN] = 1;

tcsetattr(fd, TCSANOW, &options); //设置串口参数

“`

在上面的代码中,利用tcgetattr函数获取串口设备的参数,并将其存储在options结构体中。然后,使用cfsetispeed和cfsetospeed函数配置串口的波特率。接着,使用位运算符设置其他的串口参数,包括发送8位数据,不进行奇偶校验,一位停止位等等。

使用tcsetattr函数将配置好的串口参数设置到串口设备上。

下一步,就是实现读写串口数据的功能。我们可以使用read和write函数来实现。比如,发送一个字节的数据,可以使用如下代码:

“`

unsigned char data = ‘A’;

write(fd, &data, 1);

“`

在上面的代码中,将要发送的数据存储在data变量中,然后通过write函数将其发送出去。

同样地,接收一个字节的数据,可以使用如下代码:

“`

unsigned char buf[1];

read(fd, buf, 1);

“`

在上面的代码中,定义了一个1字节的缓冲区buf,然后使用read函数从串口中读取数据,并将其放入缓冲区中。

当不再需要使用串口时,需要使用close函数将其关闭:

“`

close(fd);

“`

三、注意事项

在进行串口编程时,需要注意一些细节问题,比如:

(1)串口波特率要一致

在进行串口通信时,发送方和接收方的波特率必须一致,否则会出现乱码等问题。

(2)数据位、校验位、停止位要一致

同样地,发送方和接收方的数据位、奇偶校验和停止位也必须一致。

(3)串口设置完成后必须进行同步

在设置串口参数完成后,必须使用tcsetattr函数将参数设置到串口设备上,才能保证参数生效。

(4)使用非阻塞方式进行串口通信

在进行串口通信时,建议使用非阻塞方式,以避免程序阻塞。

(5)注意可能的错误情况

在进行串口通信时,可能会出现各种错误情况,比如读写超时、奇偶校验错误等等,需要进行适当的处理。

在进行串口编程时,需要注意各种细节问题,以保证程序正确、稳定地运行。

本文通过介绍了Linux C语言串口编程的基本知识和实现方法,包括串口通信基础知识、串口编程实现和注意事项等。希望读者能够通过本文对Linux C语言串口编程有更深入的了解,从而更好地应用于实际项目中。

相关问题拓展阅读:

Linux C 配置串口

配置串口需要包含

头文件

其中最核心的配置

结构体

为:

如何获取该结构呢?我们操作串口跟操作文件一样,也是调用 open() 函数来打开串口,

这样我们就能够得到一个

文件描述符

fd ,然后就可以调用 tcgetattr() 函数来获取上述配置结构体了。

Linux 串口默认的配置为:

波特率

9600,数据位 8 位,无

奇偶校验

,停止位 1 位,无 CTS/RTS 。

以下介绍一些常用的配置项:波特率、奇偶校验、数据位、停止位、硬件控制流。

相关接口:

Linux 将串口的波特率辩笑分为了输入波特率和输出波特率,不过最常用的场景是将两者设置成一样。

cfgetispeed() 函数获取输入波特率, cfgetospeed() 函数获取输出波特率。 cfsetispeed() 函数设置输入波特率, cfsetospeed() 函数用于设置输如掘出波特率,当然 cfsetspeed() 函数扩展为同时设置输入和输出波特率。

上述接口中的 speed_t 是一系列波特率的标志位,例如常用的波特率就为 B115200,参考下述选项:

设置奇渣灶核偶校验位可以通过修改 termios 结构体中的 c_cflag 成员来实现,若无校验,则将 PARENB 位设为 0;若有校验,则 PARENB 为 1。之后再根据 PARODD 来区分奇偶校验, PARODD 为 1 表示奇校验, PARODD 为 0 表示偶校验。例如设置无奇偶校验位:

设置数据位可以通过修改 termios 结构体中的 c_cflag 成员来实现,CS5、CS6、CS7 和 CS8 分别代表数据位 5、6、7 和 8。不过在设置数据位之前,需要先用 CSIZE 来做屏蔽字段,清楚这几个标志位,例如设置数据位为 8 位:

设置停止位可以通过修改 termios 结构体中的 c_cflag 成员来实现, CSTOPB 位为 1 表示 2 位停止位, CSTOPB 位为 0 标志 1 位停止位。例如设置停止位为 1 位:

设置硬件控制流可以通过修改 termios 结构体中的 c_cflag 成员来实现, CRTSCTS 为 1 表示使用硬件控制流,为 0 表示不使用硬件控制流。例如

使能

硬件控制流:

当然,最后还需要用 tcflush() 抛弃存储在 fd 里的未接收的数据。

再利用接口 tcsetattr() 函数将配置信息写入文件描述符 fd :

这样整个串口最常用的用法就配置完成了。

具体的配置使用可以参考我的项目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。

参考:

linux 串口编程

循环读取串口输入值时,为什么必须加入换行符才能打印出信息?

应该不是换行的问题,应该是还在缓存里面,你加个flush就可以出来,不加可能要等一会才谨扒出来野晌磨

nread=30,而buff里面只有27个字符

可能是有\n或者空格

打印颂斗可以这样,就清楚了

printf(“recevice = “,buf);

返回列表

上一篇:ds18b20 linux驱动

关于linux c语言串口程序代码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深度学习Linux C语言串口编程代码解析 (linux c语言串口程序代码)