gpt4 book ai didi

c - Linux串口编程,ttyS0

转载 作者:太空狗 更新时间:2023-10-29 11:05:28 28 4
gpt4 key购买 nike

我正在尝试学习如何使用 C 在 Linux 中对 ttyS0 串口进行编程。我有另一台机器连接到我的串口,大约每两秒发送交替的十六进制值 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);

它将重置几个重要的标志。

关于c - Linux串口编程,ttyS0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242648/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com