Linux串口调试(编程)总结(ARM通信)

最近在linux系统中写了个串口通信的程序,主要是PC机和ARM-mini2440开发板的串口进行通信(当然在开发板上也是跑的Linux操作系统),PC和开发板都要进行接收和发送。发送端要发送从0x00~0xFF中的任意字符,(包括不可见字符)但接收端某些字符老接收不到,而接收端是使用的是软中断的方式,也就是使用的信号SIGIO,进行数据的接收,但是在收到SIGIO信号后,总是接收不到数据,分析及其解决方法如下:

 

一、接收数据时

写数据时,直接调用write函数就可以了,但是在用read读数据时,就会有一定的规则了。解决这些问题之前我们先看终端I/O的两种输入处理模式:

 

(1) 规范方式输入处理。

在这种方式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。只有遇到NLEOLEOL2,和EOF。此类表示一行结束的特殊字符时,才会read到真正的数据,否则即使收到SIGIO信号,当调用read函数进行读串口时,一样读不到数据。就是在这里,自己调试了好长时间,只到设置了 newio.c_lflag  & =~ICANON .这上面的5个行定界符中,其中只有一个EOF字符在终端驱动程序对其处理后即被删除。其他4个字符则作为该行的最后一个字符返回给调用者。

0x0a'\n',以NL来表示,也就是说类似按了enter键,本行数据才输出,所以必须修改,将终端设置在非规范方式输入处理。

(2) 非规范方式输入处理。输入字符不以行为单位进行装配。

如果不作特殊处理,则默认方式是规范方式。例如:若shell的标准输入、输出是终端,在用readwrite将标准输入复制到标准输出时,终端以规范方式进行工作,每次read最多返回一行。处理整个屏幕的程序,例如vi编辑程序使用非规范方式,其原因是其命令是由不以新行符终止的一个或几个字符组成的。另外,该编辑程序使用了若干特殊字符作为编辑命令,所以它也不希望系统对特殊字符进行处理。例如,Ctrl+D字符通常是终端的文件结束符,但在vi中它是向下滚动半个屏幕的命令。

POSIX.1定义了11个特殊输入字符,其中9个可以改变。

关闭termios结构中中c_lflag字段的ICANO标志就使终端处于非规范模式。在非规范模式中,输入数据并不组成行,不处理下列特殊字符:ERASE,KILLEOFNLEOLEOL2CRREPRINTSTATUSWERASE。不处理的意思就是,不会对这些特殊的字符,进行特殊的处理。

在规范模式下,系统每次返回一行,但在非规范模式下,系统怎样才能知道在什么时候将数据返回给我们呢?如果它一次返回一个字节,那么系统开销就会很大。在启动读数据时,往往不知道要读多少数据,所以系统不能总是一次返回多个字节。

解决方法:当已读了指定量的数据后,或者已经过了给定的时间后,即通知系统返回,这种技术使用了termios结构中的c_cc数组的两个变量:MINTIMEc_cc数组中的这两个元素下标名为VMINVTIMEMIN说明一个read返回前的最小字节数据,TIME说明等待数据到达的分秒数(秒的十分之一是分秒)。

有下列四种情形:

 情形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.

<termios.h>中,有如下定义

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)

 

 

 

至此:串口能接收到所有的数据。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
串口ARM Linux系统中作为一种常见的通信方式,广泛应用于开发、调试和其他工程操作。本文将从“用户怎样在ARM Linux系统上进行串口调试?”这个问题入手,介绍串口的基本概念、通信类型、奇偶校验位等一些重要规范,以及在ARM Linux系统中进行串口调试时常见的问题、解决方法等内容。 首先,我们来看一下串口的基本概念。串口是一种同步通信方式,也称为“串行通信”,是一种在同一时间内仅传输一个字节或几个字节的数据通信方式,与并口的“并行通信”相对。串口一般包括两条数据线:TXD(发送数据线)和RXD(接收数据线),以及两条控制线:RTS(即请求发送)和CTS(即清除发送)。通常,传输数据时由发送方将数据一位一位地发送,接收方接收并组合成完整的数据串口的优点是可以走长线,适合远距离通信。由于许多机器都不带有串口,我们需要一些适配器(USB转串口适配器)来进行通信。 在进行ARM Linux系统中的串口调试时,需要了解一些串口的基本规范。其中包括波特率、数据位、停止位、奇偶校验位等。在Linux中,设置串口规范主要通过命令行或在运行时修改tty驱动程序来实现。在ARM Linux中,我们可以使用stty命令行工具来设置串口规范。stty命令行可以用来查看和设置串口的各种属性,这些属性包括波特率、数据位、停止位、奇偶校验位等,还可以设置流控制方式等。 接下来,我们来看一下在ARM Linux系统中进行串口调试时常见的问题及其解决方法。1. 数据发送不成功:可能是串口的波特率、数据位、停止位或奇偶校验位设置错误,或者硬件通信线路出现问题。解决方法:检查各项参数设置是否正确,并检查通信线路是否连接正确,排除硬件故障。2. 接收数据错误或丢失:可能是硬件通信线路出现问题,或是通信过程中出现误码,导致数据接收错误或丢失。解决方法:检查通信线路是否连接正确,以及数据接收是否存在丢包等问题。如果可能,可以尝试更换硬件设备,或进行软件升级。3. 串口卡死或崩溃:可能是系统内核出现问题,或是驱动程序出现故障。解决方法:重启系统或重新安装驱动程序,并检查系统内核是否存在异常运行的情况。 总的来说,进行ARM Linux系统中的串口调试需要掌握一些比较基本的规范、属性等,同时还需要注意一些常见的问题,并随时进行排查和解决。只有对这些知识进行深入学习和实践,才能更好地实现串口通信的功能,使得ARM Linux系统更加可靠和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值