Linux 下 串口收发的常见问题

    技术2026-05-01  2

    http://merfesyt.bokee.com/3977962.html

    氧气的小木屋

     

    Linux 下 串口收发的常见问题

                                          

     

    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;/**//*''*/

    最新回复(0)