c-编程Linux串行端口ttyS0
作者:互联网
我正在尝试学习如何使用C在Linux中对ttyS0串行端口进行编程.我将另一台机器连接到我的串行端口,大约每两秒钟发送一次交替的16进制值5f和6f.我已经与其他端口监视应用程序一起验证了这些值是否出现在端口上.在我的代码中,我正在将阻塞read()放入10个字符长的缓冲区中.即使我的另一台机器仍在发送数据,read()也会永远阻塞.如果我包括行fcntl(fd,F_SETFL,FNDELAY);将read()设置为非阻塞read()始终返回值为-1,这意味着UART缓冲区中没有数据,而我的for循环代码只是打印出缓冲区中的随机值.简而言之,我的假设是我的代码没有读取ttyS0,我也不知道为什么.下面是我的代码,希望有人能看到导致我出现问题的原因并让我直觉.顺便说一句,我使用的是Scientific Linux,我相信ttyS0是COM端口1,就像RedHat和Fedora中一样.下面的Aslo是我运行代码时的输出.它似乎可以毫无问题地写入COM端口,但是读一读它说它不可用.同样很明显,我要打印的缓冲区只是随机值,而不是已读入的数据.谢谢
控制台输出
hello world
hi again
write error: : Success
wrote 4 bytes
number of bytes read is -1
read error:: Resource temporarily unavailable
4 8 120 -99 -73 -65 41 -120 4 8
should of put something out
码
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
int main()
{
printf("hello world\n");
int n;
int fd;
char c;
int bytes;
char buffer[10];
char *bufptr;
int nbytes;
int tries;
int x;
struct termios options;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1)
{
perror("open_port: Unable to open:");
}
else
{
fcntl(fd, F_SETFL, 0);
printf("hi again\n");
}
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~( ICANON | ECHO | ECHOE |ISIG );
options.c_iflag &= ~(IXON | IXOFF | IXANY );
options.c_oflag &= ~OPOST;
tcsetattr(fd, TCSANOW, &options);
write(fd, "ATZ\r",4);
printf(" wrote\n");
bufptr = buffer;
fcntl(fd, F_SETFL, FNDELAY);
bytes = read(fd, bufptr, sizeof(buffer));
printf("number of bytes read is %d\n", bytes);
perror ("read error:");
for (x = 0; x < 10 ; x++)
{
c = buffer[x];
printf("%d ",c);
}
close(fd);
//puts(buffer[0]);
printf("\nshould of put something out \n");
return (0);
}
解决方法:
以下行会引起问题:
options.c_cflag &= CSTOPB;
它将重置c_cflag的所有其他位.
如果要使用1个停止位,请使用:
options.c_cflag &= ~CSTOPB;
如果要使用2个停止位,请使用:
options.c_cflag |= CSTOPB;
编辑:
另外,以下行也会引起问题:
fcntl(fd, F_SETFL, 0);
它将重置几个重要标志.
标签:serial-port,tty,c-3,linux 来源: https://codeday.me/bug/20191101/1983552.html