|
细心的朋友会发现,用ser2net进行网口-串口转发的时候,如果数据包中有0x11、0x13、0x0D这三个数据的时候,在上位机那边,是收不到的!好像ser2net过滤掉了它们似的,怎么回事呢?
请看如下摘要:
许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。不用说也知道,这几个肯定是特殊字符,被用作特殊控制了。关掉ICRNL和IXON选项即可解决。
c_iflag &= ~(ICRNL | IXON);
0x0d 回车符CR
0x11 ^Q VSTART字符
0x13 ^S VSTOP字符
ICRNL 将输入的CR转换为NL
IXON 使起动/停止输出控制流起作用
在《UNIX环境高级编程第二版》第18章第11小节看到把终端I/O设置为原始模式(串口通讯就是终端I/O的原始模式)时输入属性设置为
term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
原来这三个数据是串口通信里面特殊字符,具有特别的意义,难怪会被ser2net过滤掉,那么怎么保证数据完整无误地传输呢?方法一:修改ser2net源代码,这个方法太麻烦。
方法二:
用winscp登陆WIFI板,转到/etc/目录,打开ser2net.conf文件,找到如下配置:
2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS
将其中蓝色字体部分删除,变为:
2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS LOCAL -RTSCTS
保存,再重启WIFI板,ser2net就不再会过滤掉特殊字符了。
|
|