http://merfesyt.bokee.com/3977962.html
1、虚拟机下使用串口的方法
使用vmwave,默认串口设备是没有添加的,通过vmwave将设备加入即可正常使用串口。虚拟机串口打开后,可能会占用windows下的串口。另外,虚拟机的串口收发比正常的速度的确要慢许多。
2、消除Linux串口收发的一些规则
Linux 串口收发有许多模式,如:
(1) 接收返回模式: 如果串口没有接收到数据,read()函数不返回。
(2) 数据接收/n才返回接收的数据,否则read()函数返回0
(3) 特殊字符解析问题,部分特殊字符接收/发送时,会被屏蔽或者转义。如发送0x0A 接收变为0x0A 0x0A ,0x0D被屏蔽等。
(4) 接收反馈:如串口接收到数据,立即将该数据发送出去。
(上面是我遇到的一些问题,可能表述不很清楚,呵呵。如果用于收发txt文件,一般不大注意。)
3、解决问题的方法是,消除这些默认规则
关键是struct termios 的参数影响。
structtermios{
tcflag_tc_iflag;/**//*输入模式旗标*/
tcflag_tc_oflag;/**//*输出模式旗标*/
tcflag_tc_cflag;/**//*控制模式旗标*/
tcflag_tc_lflag;/**//*区域模式旗标*/
cc_tc_line;/**//*行控制(linediscipline)*/
cc_tc_cc[NCCS];/**//*控制特性*/
};
由于研究不深,如果要消除所有上面的规则,我是如下处理的
structtermiosoptions;
串口打开方式:
open(“dev/ttyS0”,O_RDWR|O_NOCTTY|O_NDELAY);
消除收发模式规则:
options.c_lflag=0;
options.c_oflag=0;
options.c_iflag=0;
消除字符屏蔽规则:
options.c_cc[VINTR] = 0;/**//*Ctrl-c*/
options.c_cc[VQUIT] =0;/**//*Ctrl-*/
options.c_cc[VERASE] = 0;/**//*del*/
options.c_cc[VKILL]=0;/**//*@*/
options.c_cc[VEOF]=0;/**//*Ctrl-d*/
options.c_cc[VTIME]=1;/**//**/
options.c_cc[VMIN]=0;/**//**/
options.c_cc[VSWTC]=0;/**//*''*/
options.c_cc[VSTART]=0;/**//*Ctrl-q*/
options.c_cc[VSTOP]=0;/**//*Ctrl-s*/
options.c_cc[VSUSP]=0;/**//*Ctrl-z*/
options.c_cc[VEOL]=0;/**//*''*/
options.c_cc[VREPRINT]=0;/**//*Ctrl-r*/
options.c_cc[VDISCARD]=0;/**//*Ctrl-u*/
options.c_cc[VWERASE]=0;/**//*Ctrl-w*/
options.c_cc[VLNEXT]=0;/**//*Ctrl-v*/
options.c_cc[VEOL2]=0;/**//*''*/