浅谈 Linux 下的串口通讯开发
什么是串口通讯
在计算机与外设通讯中,串口通讯是一种老而弥坚的通讯方式,它通过一组简单的信号线传输数据,它能够对应用上出现的许多通讯问题提供精确、不出错的通讯解决方案。
Linux 中的串口通讯
在 Linux 中,串口通讯也被广泛应用于硬件与软件的沟通连接中。Linux 操作系统提供了开源的串口通讯库,可以方便的对串口进行编程。
串口通讯的参数设置
在编写串口通讯代码时,需要设置好串口的一些参数,包括波特率、校验位、数据位、停止位。在 Linux 中,我们可以通过系统的 API 来设置这些参数。
/* 打开串口 */
int fd = open("/dev/ttyUSB0", O_RDWR);
if(fd < 0){
printf("Failed to open /dev/ttyUSB0!\n");
return -1;
}
/* 配置串口 */
struct termios opt;
tcgetattr(fd, &opt);
opt.c_cflag |= (CLOCAL | CREAD);
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;
opt.c_cflag &= ~PARENB;
opt.c_cflag &= ~CSTOPB;
opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
opt.c_iflag &= ~(OPOST | ONLCR | OCRNL);
opt.c_oflag &= ~(INLCR | ICRNL);
cfsetispeed(&opt, B9600);
cfsetospeed(&opt, B9600);
tcsetattr(fd, TCSANOW, &opt);
Linux 中的串口通讯实例
串口发送数据
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
int main(int argc, char **argv)
{
int fd;
int n;
int i;
char buff[] = "Hello World!";
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0)
{
printf("open /dev/ttyUSB0 fail!\n");
return -1;
}
struct termios opt;
tcgetattr(fd, &opt);
cfsetispeed(&opt, B9600);
cfsetospeed(&opt, B9600);
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;
opt.c_cflag &= ~PARENB;
opt.c_cflag &= ~CSTOPB;
opt.c_cflag &= ~CRTSCTS;
opt.c_cflag |= CLOCAL | CREAD;
opt.c_iflag |= IGNPAR | ICRNL;
opt.c_iflag &= ~(IXON | IXOFF | IXANY);
opt.c_oflag &= ~OPOST;
opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
opt.c_cc[VMIN] = 0;
opt.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &opt);
n = write(fd, buff, sizeof(buff));
if(n < 0)
{
printf("write error!\n");
return -1;
}
close(fd);
return 0;
}
串口接收数据
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define MAXSIZE 1024
int main(int argc, char **argv)
{
int fd;
int n;
int i;
char buf[MAXSIZE];
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0)
{
printf("open /dev/ttyUSB0 fail!\n");
return -1;
}
struct termios opt;
tcgetattr(fd, &opt);
cfsetispeed(&opt, B9600);
cfsetospeed(&opt, B9600);
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;
opt.c_cflag &= ~PARENB;
opt.c_cflag &= ~CSTOPB;
opt.c_cflag &= ~CRTSCTS;
opt.c_cflag |= CLOCAL | CREAD;
opt.c_iflag |= IGNPAR | ICRNL;
opt.c_iflag &= ~(IXON | IXOFF | IXANY);
opt.c_oflag &= ~OPOST;
opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
opt.c_cc[VMIN] = 0;
opt.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &opt);
while(1)
{
n = read(fd, buf, MAXSIZE);
if(n > 0)
{
buf[n] = '\0';
printf("read %d bytes: %s\n", n, buf);
}
}
close(fd);
return 0;
}
总结
Linux 下的串口通讯开发需要设置好串口的参数,并使用 API 进行数据的读取和发送。本文介绍了两个实例,分别是串口数据发送和接收程序的编写。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈linux下的串口通讯开发 - Python技术站