我想学习如何使用C.我有另一台机器连接到我的串行端口发送大约每两秒钟的5F和6F交替十六进制值在Linux中ttyS0形式串口编程。 我已经与这些值是出现在港口等端口监控应用验证。 在我的代码我使用的阻挡的read()成10炭化长度缓冲器中。 虽然我的另一台机器仍在发送数据, 读取()阻塞,直到永远。 如果我包括行的fcntl(FD,F_SETFL,FNDELAY); 它设置读()到非阻塞读()总是与值-1返回,这意味着没有数据是在UART缓冲器,以及我的for循环代码仅仅打印出的是在缓冲器中的随机值。 因此,在短期我的假设是,我的代码不读书ttyS0来,我不知道为什么。 下面是我的代码,希望有人会看到什么导致我的问题,把我直。 顺便说一句,我使用的是Linux的科学,我相信ttyS0来为COM端口1,因为它是在红帽和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);
}