100分!linux串口通信(cat /dev/ttyS0)问题!

时间:2022-11-13 09:32:04
 1 我用串口调试助手(windows下)向linux下的串口1 发送数据(串口线我跟其他机器互测过,没问题),
   在linux 下 cat /dev/ttyS0 接收.
   但奇怪的是 cat /dev/ttyS0没有显示受到认识数据,反而是我的串口调试助手收到了返回!!
   linux端不用 cat /dev/ttyS0读的时候没有返回!

 2 我在linux上自测,将串口1的2,3针脚端接.
   开两个shell,一端:cat /dev/ttyS0,另一端: echo 1111 >/dev/ttyS0
   cat端确实收到了1111数据,但是奇怪的是确收到了很多回车,而且重复收到了1111数据多次,回车持续刷屏!

   请各位高手帮忙呀! 

23 个解决方案

#1


引用楼主 zxcvbnmasd 的回复:
 2 我在linux上自测,将串口1的2,3针脚端接.
  开两个shell,一端:cat /dev/ttyS0,另一端: echo 1111 >/dev/ttyS0

没想到还可以这么干。
我只听说过可以把两个串口连起来,然后cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1

#2


可能是串口参数设置的问题。

#3


你windows要发送可显示字符,cat才能显示出来。
串口调试助手收到返回,这个可能是你的串口1设置了回显。或者你的串口驱动有问题。

#4


不清楚,友情帮顶

#5


不太明白
在看看设置

#6


引用 1 楼 *mill 的回复:
引用楼主 zxcvbnmasd 的回复:
2 我在linux上自测,将串口1的2,3针脚端接.
开两个shell,一端:cat /dev/ttyS0,另一端: echo 1111 >/dev/ttyS0

没想到还可以这么干。
我只听说过可以把两个串口连起来,然后cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1

请问 "cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1"
     这里为什么一个ttyS0,一个ttyS1?
     是笔误么?

#7


引用 2 楼 *mill 的回复:
可能是串口参数设置的问题。



linux 下串口参数的设置除了在程序中设置以外,还可以怎么设置.

就像你说的一边 echo ,一边cat, 这里不需要首先设置波特率等参数么?

#8


setserial 可以设置串口,具体的man下就知道了。
引用 7 楼 zxcvbnmasd 的回复:
linux 下串口参数的设置除了在程序中设置以外,还可以怎么设置.

就像你说的一边 echo ,一边cat, 这里不需要首先设置波特率等参数么?

#9


"我在linux上自测,将串口1的2,3针脚端接"
“cat端确实收到了1111数据,但是奇怪的是确收到了很多回车,而且重复收到了1111数据多次,回车持续刷屏!”

是不是因为 同一个串口的 发送、接收缓存区 是同一个的原因? 你这么干 同一个串口即要读取又要发送

#10


请问 "cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1"
  这里为什么一个ttyS0,一个ttyS1?
  是笔误么?

1楼说的是应该是用标准川口线把本机的两个串口连起来,一个读一个写,自然是一个ttyS0,一个ttyS1

#11


提示:
因为cat 后打印的是字符,所以有可能有的字符不能打印出来
所以建议你自己写一个简单的读写程序,可以发送一些数据,
然后再接受数据,看看有没有出错,下面我给你两个函数接口
/************************************************************************************
 * tty_open_port() open the tty port
 ************************************************************************************/

int  tty_open_port(const char *dev_name)
{

        int fd; /* File descriptor for the port */
        fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY);
        if (-1 == fd)
        {
          perror("open_port: Unable to open tty " );
          exit(1);
        }
        else
        {

         if(DEBUG)
 printf("The %s is opened \n",dev_name);
        }
/*
       if( (val=fcntl(fd, F_SETFL, 0))< 0)
      perror("fcntl failed");
*/
if ( isatty(fd) == 0 )
perror("This is not a tty device ");

        return (fd);
}
/************************************************************************************
 * tty_set_port() set the attributes of the tty
 ************************************************************************************/
 int  tty_set_port (int  fd , int nSpeed , int  nBits , char nEvent , int  nStop )
{
struct  termios new_ios,old_ios;

if ( tcgetattr ( fd , &new_ios ) !=0 )
perror("Save the terminal error");

bzero( &old_ios , sizeof( struct termios ));
old_ios=new_ios;

tcflush(fd,TCIOFLUSH) ;
new_ios.c_cflag |= CLOCAL |CREAD ;
new_ios.c_cflag &= ~CSIZE ;

switch (nBits)
{
case 5:
new_ios.c_cflag |=CS5 ;
break ;
case 6:
new_ios.c_cflag |=CS6 ;
break ;
case 7:
new_ios.c_cflag |=CS7 ;
break ;
case 8:
new_ios.c_cflag |=CS8 ;
break ;
default:
perror("Wrong  nBits");
break ;
}
switch (nSpeed )
{
case 2400:
cfsetispeed(&new_ios , B2400);
cfsetospeed(&new_ios , B2400);
break;
case 4800:
cfsetispeed(&new_ios , B4800);
cfsetospeed(&new_ios , B4800);
break;
case 9600:
cfsetispeed(&new_ios , B9600);
cfsetospeed(&new_ios , B9600);
break;
case 19200:
cfsetispeed(&new_ios , B19200);
cfsetospeed(&new_ios , B19200);
break;
case 115200:
cfsetispeed(&new_ios , B115200);
cfsetospeed(&new_ios , B115200);
break;
case 460800:
cfsetispeed(&new_ios , B460800);
cfsetospeed(&new_ios , B460800);
break;
default:
perror("Wrong  nSpeed");
break;
}
switch (nEvent )
{
case 'o':
case 'O':
new_ios.c_cflag |= PARENB ;
new_ios.c_cflag |= PARODD ;
new_ios.c_iflag |= (INPCK | ISTRIP);
break ;
case 'e':
case 'E':
new_ios.c_iflag |= (INPCK | ISTRIP);
new_ios.c_cflag |= PARENB ;
new_ios.c_cflag &= ~PARODD ;
break ;
case 'n':
case 'N':
new_ios.c_cflag &= ~PARENB ;
new_ios.c_iflag &= ~INPCK  ;
break ;
default:
perror("Wrong nEvent");
break ;
}
if ( nStop == 1 )
new_ios.c_cflag &= ~CSTOPB ;
else if ( nStop == 2 )
new_ios.c_cflag |= CSTOPB ;

    /*No hardware control*/
    new_ios.c_cflag &= ~CRTSCTS;
    /*No software control*/
    new_ios.c_iflag &= ~(IXON | IXOFF | IXANY);
    /*delay time set */
    new_ios.c_cc[VTIME] = 0 ;
    new_ios.c_cc[VMIN] = 0 ;

    /*raw model*/
    new_ios.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);
    new_ios.c_oflag  &= ~OPOST;

    new_ios.c_iflag &= ~(INLCR|IGNCR|ICRNL);
    new_ios.c_iflag &= ~(ONLCR|OCRNL);

    new_ios.c_oflag &= ~(INLCR|IGNCR|ICRNL);
    new_ios.c_oflag &= ~(ONLCR|OCRNL);


tcflush(fd,TCIOFLUSH) ;
if (tcsetattr(fd,TCSANOW,&new_ios) != 0 )
{
perror("Set the terminal error");
tcsetattr(fd,TCSANOW,&old_ios);
return -1 ;
}

return  0;
}

#12


建议把你读取到是数据用十六进制打印出来

#13


没看明白……

#14


为啥我的cat /dev/ttyS0收不到数据呢?

#15


引用 14 楼 tony142857 的回复:
为啥我的cat /dev/ttyS0收不到数据呢?

偶的也是的,一起关注!!!!

#16


学习中@!关注!!!

#17


cat和echo都是没有设置串口的,而串口助手有设置,如果两边没对上确实是会收不到。但是linux自己把同一个串口环起来自己读自己写是能收到的

#18


同关注啊!

#19


不要用cat跟echo,自己写简单的测试程序

#20


楼主问题1我也遇过,和你一样。其实很简单,windows的串口调试软件发送时多发一个回车键就行了,而且之前发过去没显示的都会显示出来。
我觉得这跟linux下printf不加"\n"就没显示是一个道理的。

#21


串口调试软件多发一个回车就行了

#22


引用 14 楼  的回复:
为啥我的cat /dev/ttyS0收不到数据呢?


俺的也是啊。。。

#23


看看解答内容

#1


引用楼主 zxcvbnmasd 的回复:
 2 我在linux上自测,将串口1的2,3针脚端接.
  开两个shell,一端:cat /dev/ttyS0,另一端: echo 1111 >/dev/ttyS0

没想到还可以这么干。
我只听说过可以把两个串口连起来,然后cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1

#2


可能是串口参数设置的问题。

#3


你windows要发送可显示字符,cat才能显示出来。
串口调试助手收到返回,这个可能是你的串口1设置了回显。或者你的串口驱动有问题。

#4


不清楚,友情帮顶

#5


不太明白
在看看设置

#6


引用 1 楼 *mill 的回复:
引用楼主 zxcvbnmasd 的回复:
2 我在linux上自测,将串口1的2,3针脚端接.
开两个shell,一端:cat /dev/ttyS0,另一端: echo 1111 >/dev/ttyS0

没想到还可以这么干。
我只听说过可以把两个串口连起来,然后cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1

请问 "cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1"
     这里为什么一个ttyS0,一个ttyS1?
     是笔误么?

#7


引用 2 楼 *mill 的回复:
可能是串口参数设置的问题。



linux 下串口参数的设置除了在程序中设置以外,还可以怎么设置.

就像你说的一边 echo ,一边cat, 这里不需要首先设置波特率等参数么?

#8


setserial 可以设置串口,具体的man下就知道了。
引用 7 楼 zxcvbnmasd 的回复:
linux 下串口参数的设置除了在程序中设置以外,还可以怎么设置.

就像你说的一边 echo ,一边cat, 这里不需要首先设置波特率等参数么?

#9


"我在linux上自测,将串口1的2,3针脚端接"
“cat端确实收到了1111数据,但是奇怪的是确收到了很多回车,而且重复收到了1111数据多次,回车持续刷屏!”

是不是因为 同一个串口的 发送、接收缓存区 是同一个的原因? 你这么干 同一个串口即要读取又要发送

#10


请问 "cat /dev/ttyS0 同时 echo 1111 >/dev/ttyS1"
  这里为什么一个ttyS0,一个ttyS1?
  是笔误么?

1楼说的是应该是用标准川口线把本机的两个串口连起来,一个读一个写,自然是一个ttyS0,一个ttyS1

#11


提示:
因为cat 后打印的是字符,所以有可能有的字符不能打印出来
所以建议你自己写一个简单的读写程序,可以发送一些数据,
然后再接受数据,看看有没有出错,下面我给你两个函数接口
/************************************************************************************
 * tty_open_port() open the tty port
 ************************************************************************************/

int  tty_open_port(const char *dev_name)
{

        int fd; /* File descriptor for the port */
        fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY);
        if (-1 == fd)
        {
          perror("open_port: Unable to open tty " );
          exit(1);
        }
        else
        {

         if(DEBUG)
 printf("The %s is opened \n",dev_name);
        }
/*
       if( (val=fcntl(fd, F_SETFL, 0))< 0)
      perror("fcntl failed");
*/
if ( isatty(fd) == 0 )
perror("This is not a tty device ");

        return (fd);
}
/************************************************************************************
 * tty_set_port() set the attributes of the tty
 ************************************************************************************/
 int  tty_set_port (int  fd , int nSpeed , int  nBits , char nEvent , int  nStop )
{
struct  termios new_ios,old_ios;

if ( tcgetattr ( fd , &new_ios ) !=0 )
perror("Save the terminal error");

bzero( &old_ios , sizeof( struct termios ));
old_ios=new_ios;

tcflush(fd,TCIOFLUSH) ;
new_ios.c_cflag |= CLOCAL |CREAD ;
new_ios.c_cflag &= ~CSIZE ;

switch (nBits)
{
case 5:
new_ios.c_cflag |=CS5 ;
break ;
case 6:
new_ios.c_cflag |=CS6 ;
break ;
case 7:
new_ios.c_cflag |=CS7 ;
break ;
case 8:
new_ios.c_cflag |=CS8 ;
break ;
default:
perror("Wrong  nBits");
break ;
}
switch (nSpeed )
{
case 2400:
cfsetispeed(&new_ios , B2400);
cfsetospeed(&new_ios , B2400);
break;
case 4800:
cfsetispeed(&new_ios , B4800);
cfsetospeed(&new_ios , B4800);
break;
case 9600:
cfsetispeed(&new_ios , B9600);
cfsetospeed(&new_ios , B9600);
break;
case 19200:
cfsetispeed(&new_ios , B19200);
cfsetospeed(&new_ios , B19200);
break;
case 115200:
cfsetispeed(&new_ios , B115200);
cfsetospeed(&new_ios , B115200);
break;
case 460800:
cfsetispeed(&new_ios , B460800);
cfsetospeed(&new_ios , B460800);
break;
default:
perror("Wrong  nSpeed");
break;
}
switch (nEvent )
{
case 'o':
case 'O':
new_ios.c_cflag |= PARENB ;
new_ios.c_cflag |= PARODD ;
new_ios.c_iflag |= (INPCK | ISTRIP);
break ;
case 'e':
case 'E':
new_ios.c_iflag |= (INPCK | ISTRIP);
new_ios.c_cflag |= PARENB ;
new_ios.c_cflag &= ~PARODD ;
break ;
case 'n':
case 'N':
new_ios.c_cflag &= ~PARENB ;
new_ios.c_iflag &= ~INPCK  ;
break ;
default:
perror("Wrong nEvent");
break ;
}
if ( nStop == 1 )
new_ios.c_cflag &= ~CSTOPB ;
else if ( nStop == 2 )
new_ios.c_cflag |= CSTOPB ;

    /*No hardware control*/
    new_ios.c_cflag &= ~CRTSCTS;
    /*No software control*/
    new_ios.c_iflag &= ~(IXON | IXOFF | IXANY);
    /*delay time set */
    new_ios.c_cc[VTIME] = 0 ;
    new_ios.c_cc[VMIN] = 0 ;

    /*raw model*/
    new_ios.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);
    new_ios.c_oflag  &= ~OPOST;

    new_ios.c_iflag &= ~(INLCR|IGNCR|ICRNL);
    new_ios.c_iflag &= ~(ONLCR|OCRNL);

    new_ios.c_oflag &= ~(INLCR|IGNCR|ICRNL);
    new_ios.c_oflag &= ~(ONLCR|OCRNL);


tcflush(fd,TCIOFLUSH) ;
if (tcsetattr(fd,TCSANOW,&new_ios) != 0 )
{
perror("Set the terminal error");
tcsetattr(fd,TCSANOW,&old_ios);
return -1 ;
}

return  0;
}

#12


建议把你读取到是数据用十六进制打印出来

#13


没看明白……

#14


为啥我的cat /dev/ttyS0收不到数据呢?

#15


引用 14 楼 tony142857 的回复:
为啥我的cat /dev/ttyS0收不到数据呢?

偶的也是的,一起关注!!!!

#16


学习中@!关注!!!

#17


cat和echo都是没有设置串口的,而串口助手有设置,如果两边没对上确实是会收不到。但是linux自己把同一个串口环起来自己读自己写是能收到的

#18


同关注啊!

#19


不要用cat跟echo,自己写简单的测试程序

#20


楼主问题1我也遇过,和你一样。其实很简单,windows的串口调试软件发送时多发一个回车键就行了,而且之前发过去没显示的都会显示出来。
我觉得这跟linux下printf不加"\n"就没显示是一个道理的。

#21


串口调试软件多发一个回车就行了

#22


引用 14 楼  的回复:
为啥我的cat /dev/ttyS0收不到数据呢?


俺的也是啊。。。

#23


看看解答内容