在C语言中,串口通信收发数据是一个常见且重要的应用场景,下面将详细介绍如何使用C语言实现串口通信的收发数据功能。
1、打开串口:首先需要使用open()
函数打开串口设备文件,在Linux系统中,串口设备文件通常位于/dev/
目录下,如/dev/ttyS0
或/dev/ttyUSB0
等,打开串口时需要指定设备文件路径和打开模式,如open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY)
,其中O_RDWR
表示可读写,O_NOCTTY
表示不将该设备作为控制终端,O_NDELAY
表示非阻塞模式。
2、配置串口参数:通过调用tcgetattr()
函数获取当前串口的配置参数,然后对这些参数进行修改,如设置波特率、数据位数、奇偶校验等,修改完成后,使用tcsetattr()
函数将修改后的参数设置回去,设置波特率为9600、8位数据位、无校验、1位停止位的代码如下:
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &options);
3、读取串口数据:使用read()
函数从串口中读取数据,该函数会一直阻塞直到有数据可读取,可以设置循环,根据需要每次读取固定长度的数据。read(fd, buf, 256)
,其中fd
是打开串口设备的文件描述符,buf
是存储数据的缓冲区。
4、写入串口数据:使用write()
函数将数据写入串口,可以将需要发送的数据存储到一个缓冲区中,然后通过write(fd, buf, len)
发送,其中len
是需要发送的数据长度。
5、关闭串口:最后需要关闭打开的串口设备文件,使用close()
函数即可,例如close(fd)
。
为了提高串口通信的效率,可以使用多线程来实现数据的并发收发,下面是一个使用pthread库实现多线程串口通信收发的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <pthread.h>
int fd; // 串口文件描述符
pthread_t tid[2]; // 线程标识符数组
char buf[256]; // 数据缓冲区
// 读线程函数
void *readThread(void *arg) {
int n;
while (1) {
n = read(fd, buf, sizeof(buf));
if (n > 0) {
buf[n] = '