C linux串口编程中的读回垃圾数据
我想使用RS232端口与电脑通信。我可以使用write()函数打开“/dev/ttyS0”并写入数据,但使用read()无法从“dev/ttyS0”读取正确的数据read()函数读取不必要的数据。请告诉我如何解决此问题 我的程序代码如下: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>
#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规则。