今天在做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写错,我已进行了修改
现在把原因及解决方法写出来:
在我们发送字符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
评论列表