Linux在串口下接收数据时忽略了0X0D问题

jackxiang 2009-7-17 11:13 | |
今天在做GSM模块收发短信中,遇到了一个问题,0X0D和0X0A会自动只收到0X0A,在网上查了下,果真有这个问题。

现在把原因及解决方法写出来:



在我们发送字符0x0d的时候,往往接受端得到的字符是0x0a 这是怎么回事,原因是在串口配置中c_iflag和c_oflag中存在从NL-CR 和CR-NL的映射,也就是说,串口能够把回车和换行看成一个字符,所以,此时我们应该屏蔽掉这些,用options.c_oflag &=~(INLCR|IGNCR|ICRNL|);和options.c_oflag &=~(ONLCR|OCRNL); 进行配置。



还有一个例子:

  struct  termios Opt;
  int  m_fd = open("/dev/ttyAM1", O_RDWR | O_NOCTTY | O_NDELAY);
  if(m_fd==-1) perror("lcd_drawlib: Cannot open ttyAM1! \n" ) ;
  //设置 串口的NL-CR 和CR-NL 的映射
  tcgetattr(m_fd,&Opt);               //首先读取系统默认设置options
  Opt.c_iflag &=~(INLCR|IGNCR|ICRNL);
  Opt.c_oflag &=~(ONLCR|OCRNL);  
  tcflush(m_fd,TCIFLUSH); /* Update the options and do it NOW */    //刷新和立刻写进去
//设置波特率        
  cfsetispeed(&Opt,B9600);
  cfsetospeed(&Opt,B9600);
  tcsetattr(m_fd,TCSANOW,&Opt);
  write(m_fd, "\x0a", 1);
  close(m_fd);


参考资料:http://www.oldlinux.org/oldlinux/viewthread.php?tid=7903,http://www.idcnews.net/html/edu/20070101/285934.html注意:参考中Opt.c_iflag写错,我已进行了修改

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1839/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2009-7-17 11:13
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]