首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux串口调试(编程)总结(2)

Linux串口调试(编程)总结(2)

有下列四种情形:
情形AMIN>0TIME>0

TIME
说明字节间的计时器,在接到第一个字节时才启动它,在该计时器超时之前,若已接到MIN个字节,则read返回MIN个字节。如果在接到MIN个字节之前,该计时器已超时,则read返回已经接收到的字节,因为只有在接收到第一个字节时才启动,所以在计时器超时时,至少返回一个字节。这种情形中,在接到第一个字节之前,调用者阻塞。如果在调用read时数据已经可用,则这如同在read后数据立即被接收到一样。

情形B MIN>0,TIME==0
已经接到了MIN个字节时,read才返回,这可以造成read的无限期阻塞
情形CMIN == 0TIME>0
TIME 指定了一个调用read时启动的读计时器,在接收到一个字节或者该计时器超时时,read即返回,如果是计时器超时,则read返回0.
情形DMIN == 0TIME ==0
如果有数据可用,则read最多返回所要求的字节数。如果无数据可用,则read立即返回0.

中,有如下定义

struct termios {

tcflag_t c_iflag;
/* input mode flags */


tcflag_t c_oflag;
/* output mode flags */


tcflag_t c_cflag;
/* control mode flags */


tcflag_t c_lflag;
/* local mode flags */


cc_t c_line;
/* line discipline */


cc_t c_cc[NCCS];
/* control characters */

};

c_iflag由终端设备驱动程序用来控制输入特性(剥除输入字节的第8位,允许输
入奇偶校验等等)
c_oflag则控制输出特性(执行输出处理,将新行映照为C R / L F等)
c_cflag影响到UART串行线(忽略调制解调器的状态线,每个字符的一个或两个停止位等等),
c_lflag影响驱动程序和用户之间的界面(回送的开或关,可视的擦除符,允许终端产生的信
号,对后台作业输出的控制停止信号等)。
修改非规范方式输入处理,如下:struct termios options;
tcgetattr( fd,&options)

options.c_lflag &= ~(ICANON );
通过修改c_lflag本地模式,将ICANON属性去掉,ICANON就是规范化方式。
二、接收到数据:


其余数据全正确

03以前的数据全部没有,而0x03相当于 ^c, CTRL+C ^c, ^?ISIG来控制,那么去除该控制,应该就
可以显示03了,再次修改为:

options.c_lflag &= ~(ICANON |ISIG);




三、接收到数据:

00 01 02 03 04 05 06 07 08 09 0a 0b
0c 0a 0e 0f ……

其余数据全部正确

看,0d变成了0a

c_iflag模式中,有ICRNL项,IGNCR项,将两者去掉:

options.c_iflag &= ~(ICRNL|IGNCR)




至此:串口能接收到所有的数据。
继承事业,薪火相传
返回列表