Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux串口编程中的读回垃圾数据_C_Linux_Serial Port - Fatal编程技术网

C linux串口编程中的读回垃圾数据

C linux串口编程中的读回垃圾数据,c,linux,serial-port,C,Linux,Serial Port,我想使用RS232端口与电脑通信。我可以使用write()函数打开“/dev/ttyS0”并写入数据,但使用read()无法从“dev/ttyS0”读取正确的数据read()函数读取不必要的数据。请告诉我如何解决此问题 我的程序代码如下: #include <stdio.h> #include <string.h> #include <fcntl.h> #include <termios.h> #include <unistd.h>

我想使用RS232端口与电脑通信。我可以使用write()函数打开“/dev/ttyS0”并写入数据,但使用read()无法从“dev/ttyS0”读取正确的数据read()函数读取不必要的数据。请告诉我如何解决此问题

我的程序代码如下:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

int main()
{
    int n = 0, fd = 0, bytes = 0;

    char buffer[10];

    struct termios term;

    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1)
    {
        perror("open");
        return;
    }
    else
    {
        fcntl(fd, F_SETFL, 0);
        perror("Port");
    }

    tcgetattr(fd, &term);

    cfsetispeed(&term, B115200);
    cfsetospeed(&term, B115200);

    term.c_cflag |= (CLOCAL | CREAD);
    term.c_cflag &= ~PARENB;
    term.c_cflag &= ~CSTOPB;
    term.c_cflag &= ~CSIZE;
    term.c_cflag |= CS8;
    term.c_cflag &= ~CRTSCTS;
    term.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    term.c_iflag &= ~(IXON | IXOFF | IXANY);
    term.c_oflag &= ~OPOST; 

    term.c_cc[VMIN] = 0;
    term.c_cc[VTIME] = 10;


    tcsetattr(fd, TCSANOW, &term); 

    printf("Enter the string...\n");
        scanf("%s", buffer);

        write(fd, buffer, sizeof(buffer));
        perror("write");

//  fcntl(fd, F_SETFL, FNDELAY);    

    sleep(1);

    bytes = read(fd, buffer, sizeof(buffer));
    perror("read");

    buffer[bytes] = '\0';
    printf("Bytes : %d\n", bytes);
    printf("%s\n", buffer);
    memset(buffer, '\0', 10);   
}
#包括
#包括
#包括
#包括
#包括
int main()
{
int n=0,fd=0,bytes=0;
字符缓冲区[10];
结构术语;
fd=开放(“/dev/ttyS0”,O|RDWR | O|NOCTTY | O|NDELAY);
如果(fd==-1)
{
佩罗(“公开”);
返回;
}
其他的
{
fcntl(fd,F_SETFL,0);
佩罗尔(“港口”);
}
tcgetattr(fd和期限);
cfsetispeed(和术语,B115200);
cfsetospeed(和术语,B115200);
术语c|u cflag |=(CLOCAL | CREAD);
term.c_cflag&=~PARENB;
term.c_cflag&=~CSTOPB;
term.c_cflag&=~CSIZE;
术语c|cflag |=CS8;
term.c_cflag&=~CRTSCTS;
术语c|lflag&=~(ICANON | ECHO | ECHO | ISIG);
术语c|u iflag&=~(IXON | IXOFF | IXANY);
术语c_of lag&=~OPOST;
术语c_cc[VMIN]=0;
术语c_cc[VTIME]=10;
tcsetattr(fd、TCSANOW和term);
printf(“输入字符串…\n”);
scanf(“%s”,缓冲区);
写入(fd,buffer,sizeof(buffer));
佩罗(“书面”);
//fcntl(fd、F_设置FL、FNDELAY);
睡眠(1);
字节=读取(fd,buffer,sizeof(buffer));
佩罗(“阅读”);
缓冲区[字节]='\0';
printf(“字节:%d\n”,字节);
printf(“%s\n”,缓冲区);
内存集(缓冲区“\0”,10);
}
正如我已经回答的,下面的代码运行良好。你有没有试着换串行线?您确定正在短接串行DB9连接器的针脚2和针脚3吗

int main()
{
    int n = 0, fd = 0, bytes = 0;
    char ch = 0;

    char buffer[128], *bufPtr;
    int nBytes = 0, tries = 0, x = 0;

    struct termios term;

    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1)
    {
        perror("open");
        return;
    }
    else
    {
        fcntl(fd, F_SETFL, 0);
        perror("Port");
    }

    if (n = tcgetattr(fd, &term) == -1)
    {
        perror("tcgetattr");
        return;
    }

    if (n = cfsetispeed(&term, B115200) == -1)
    {
        perror("cfsetispeed");
        return;
    }

    if (n = cfsetospeed(&term, B115200) == -1)
    {
        perror("cfsetospeed");
        return;
    }

    term.c_cflag |= (CLOCAL | CREAD);
    term.c_cflag &= ~PARENB;
    term.c_cflag &= ~CSTOPB;
    term.c_cflag &= ~CSIZE;
    term.c_cflag |= CS8;
    term.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    term.c_iflag &= ~(IXON | IXOFF | IXANY);
    term.c_cflag &= ~CRTSCTS;
    term.c_oflag &= ~OPOST;

    if (n = tcsetattr(fd, TCSANOW, &term) == -1)
    {
        perror("tcsetattr");
        return;
    }

    char stringToSend[128];

    printf("Enter the string...\n");
    scanf("%s", stringToSend);

    size_t len = strlen(stringToSend) +1 ;

    write(fd,stringToSend, len);
    perror("write");

    size_t receivedBytes = 0;
    bytes = 0;
    memset(buffer, 0x00, sizeof(buffer));
    while (receivedBytes<len)
    {
       bytes = read(fd, &buffer[receivedBytes], sizeof(buffer)-1);
       perror("read");

       if (bytes > 0)
           receivedBytes += bytes;
    }

    printf("Bytes : %d and data: %s\n", receivedBytes, buffer);
}
intmain()
{
int n=0,fd=0,bytes=0;
char ch=0;
字符缓冲区[128],*bufPtr;
int nBytes=0,trys=0,x=0;
结构术语;
fd=开放(“/dev/ttyUSB0”,O|RDWR | O|NOCTTY | O|NDELAY);
如果(fd==-1)
{
佩罗(“公开”);
返回;
}
其他的
{
fcntl(fd,F_SETFL,0);
佩罗尔(“港口”);
}
如果(n=tcgetattr(fd,&term)=-1)
{
perror(“tcgetattr”);
返回;
}
如果(n=cfsetispeed(&term,B115200)=-1)
{
perror(“cfsetispeed”);
返回;
}
如果(n=cfsetospeed(&term,B115200)=-1)
{
perror(“cfsetospeed”);
返回;
}
术语c|u cflag |=(CLOCAL | CREAD);
term.c_cflag&=~PARENB;
term.c_cflag&=~CSTOPB;
term.c_cflag&=~CSIZE;
术语c|cflag |=CS8;
术语c|lflag&=~(ICANON | ECHO | ECHO | ISIG);
术语c|u iflag&=~(IXON | IXOFF | IXANY);
term.c_cflag&=~CRTSCTS;
术语c_of lag&=~OPOST;
如果(n=tcsettr(fd、TCSANOW和term)=-1)
{
佩罗尔(“tcsetattr”);
返回;
}
char-stringToSend[128];
printf(“输入字符串…\n”);
scanf(“%s”,stringToSend);
尺寸长度=strlen(stringToSend)+1;
写入(fd、stringToSend、len);
佩罗(“书面”);
接收字节的大小=0;
字节=0;
memset(buffer,0x00,sizeof(buffer));
while(接收字节0)
接收字节+=字节;
}
printf(“字节:%d,数据:%s\n”,接收字节,缓冲区);
}

请举例说明您正在读取的数据以及您期望的数据。为什么要使用非阻塞IO?你知道这会有什么影响吗?比如“Hello world”读写垃圾data@FUZxxl:说得好。调用
tcgetattr
时,
fd
可能没有准备好(因此,它可能只是返回
-EAGAIN
。该代码不会检查任何错误,因此我建议使用
strace
查看进行了哪些系统调用,以及它们的返回值。此外,使用已知良好的终端模拟器,如
minicom
,以确保一切正常工作。@PeterCordes库函数从不清除
errno
。这是POSIX规则。