位置:51电子网 » 技术资料 » 通信网络

Linux串口通信编程(Linux Serial Programming HOWTO)

发布时间:2008/8/18 0:00:00 访问次数:944

最好的侦错你程式码的方法是建构另一台 linux box, 并把两台电脑用 null-modem 缆线连接. 用 miniterm以传送字元到你的 linux box. miniterm 很容易编译而它会把所有输入到键盘的字元透过序列埠传送. 只有这个宣告定义会被检查 #define modemdevice "/dev/ttys0". 如果是 com1 设定为 ttys0, 如果是 com2 设定为 ttys1 等等.. 先前的测试是必要的, 所有的 字元都将以 raw 方式 (不经任何处理) 直接传送. 测试是否连接正确, 在两台电脑上都启动 miniterm 然後随便在键盘上乱按. 在其中一台上输入的字元应该会显示在另一台电脑上反之亦同. 但输入的字元不会回应到与之相连的萤幕上.

要自制 null-modem 的电缆, 你必需要把 txd (传送) 及 rxd (接收) 两线对调.

当然也可以只用一台电脑来作相同的测试, 只要电脑上有两个未使用的序列埠. 当然你也就要执行两个 miniterm 来当虚拟控制台. 如果你是藉由拔去滑鼠来取得另一个序列埠, 记得要把 /dev/mouse 装置重新导向, 如果它存在的话. 如果你使用多埠的序列埠控制卡, 请确定它已设定正确. 当我在我的电脑上测试时也曾经因为设定错误而出过槌. 当我连到另一台电脑, 通讯埠开始传送字元. 就因为刚好这不是完整的非同步式传输, 所以可在同一台电脑上执行两个程式.

连接埠设定
/dev/ttys* 装置会被当成连接到你的 linux box 的终端机, 并且在启动後就设定好了. 这个观念在你写 raw 装置的通讯程式时必需记住. 也就是说这个连接埠被设定为回应所有自这个装置送出的字元, 而用在资料传输时通常这种要改变这种工作模式.

所有的参数可以由一个小程式简单的完成. 设定参数被放在一个结构体内 struct termios, 他的定义档在 :

#define nccs 19
struct termios {
tcflag_t c_iflag; /* 输入模式旗标 */
tcflag_t c_oflag; /* 输出模式旗标 */
tcflag_t c_cflag; /* 控制模式旗标 */
tcflag_t c_lflag; /* 区域模式旗标 */
cc_t c_line; /* 行控制 (line discipline) */
cc_t c_cc[nccs]; /* 控制特性 */
};

这个档案也包含所有的旗标定义. 输入模式旗标在 c_iflag 掌管所有的输入处理, 这就意谓著由装置上传来的字元在还没用 read 功能读取前可以先处理过. 同理 c_oflag 掌管所有的输出处理. c_cflag 包含连接埠的设定, 如 鲍率, 每字元多少位元, 停止位元, 等等.. 区域模式旗标放在 c_lflag 用来侦测字元是否回应, 而讯号会送到你的程式, 等等.. 最後 c_cc 阵列定义了档案终了的控制字元, 停止, 等等.. 预设的控制字元值放在 . 有关旗标的细节摆在使用手册 termios(3). termios 结构体内的 c_line 行控制 (line discipline) 元素, 不能在 posix 相容的系统下使用译者注:这里所说的 line discipline 虽然我翻成 行控制但还是很难说出那是舍. 如果想知道请看看 kernel :( .


序列装置的输入观念
有三个输入的观念要说明. 按照所要写的应用程式选用适合的观念. 尽量避免使用回圈来读取单一的字元再组成字串. 我曾这样做过, 会掉字元, 且对 read 而言不会显示任何错误.


标准输入程序
这是终端机的标准处理程序, 但用来与其他 dl 型式的以行为单位的输入通讯也很有用, 也就是 read 会传回一整行完整的输入资料. 行预设的终止字元是 nl (ascii lf), 档案结束符, 或行终止字元. 预设环境下, cr (是 dos/windows 预设的行终止符) 不会终止一行的叙述.

标准的输入处理程序还可以处理 清除, 删除字, 重印字元, 及转换 cr 为 nl 等等功能..


非标准输入程序
非标准输入程序可以用在需要每次读取固定数量字元的情况, 并允许使用字元输入时间的计时器. 这种模式可以用在读取固定字元数量的应用程式, 或者所连接的装置会突然送出大量字元的状况.

非同步式输入
以上所叙述的两种模式都可以用在非同步与同步的传输模式. 预设是在同步的模式下工作, 也就是在尚未读取完之前, read 的状态会被阻断. 而非同步模式下 read 的状态会直接返回并送出讯号到所叫用的程式直到完成工作. 这个讯号可以由讯号的处理程式 handler...来接收.


等待来自多个讯号来源的输入
这并不是一个

最好的侦错你程式码的方法是建构另一台 linux box, 并把两台电脑用 null-modem 缆线连接. 用 miniterm以传送字元到你的 linux box. miniterm 很容易编译而它会把所有输入到键盘的字元透过序列埠传送. 只有这个宣告定义会被检查 #define modemdevice "/dev/ttys0". 如果是 com1 设定为 ttys0, 如果是 com2 设定为 ttys1 等等.. 先前的测试是必要的, 所有的 字元都将以 raw 方式 (不经任何处理) 直接传送. 测试是否连接正确, 在两台电脑上都启动 miniterm 然後随便在键盘上乱按. 在其中一台上输入的字元应该会显示在另一台电脑上反之亦同. 但输入的字元不会回应到与之相连的萤幕上.

要自制 null-modem 的电缆, 你必需要把 txd (传送) 及 rxd (接收) 两线对调.

当然也可以只用一台电脑来作相同的测试, 只要电脑上有两个未使用的序列埠. 当然你也就要执行两个 miniterm 来当虚拟控制台. 如果你是藉由拔去滑鼠来取得另一个序列埠, 记得要把 /dev/mouse 装置重新导向, 如果它存在的话. 如果你使用多埠的序列埠控制卡, 请确定它已设定正确. 当我在我的电脑上测试时也曾经因为设定错误而出过槌. 当我连到另一台电脑, 通讯埠开始传送字元. 就因为刚好这不是完整的非同步式传输, 所以可在同一台电脑上执行两个程式.

连接埠设定
/dev/ttys* 装置会被当成连接到你的 linux box 的终端机, 并且在启动後就设定好了. 这个观念在你写 raw 装置的通讯程式时必需记住. 也就是说这个连接埠被设定为回应所有自这个装置送出的字元, 而用在资料传输时通常这种要改变这种工作模式.

所有的参数可以由一个小程式简单的完成. 设定参数被放在一个结构体内 struct termios, 他的定义档在 :

#define nccs 19
struct termios {
tcflag_t c_iflag; /* 输入模式旗标 */
tcflag_t c_oflag; /* 输出模式旗标 */
tcflag_t c_cflag; /* 控制模式旗标 */
tcflag_t c_lflag; /* 区域模式旗标 */
cc_t c_line; /* 行控制 (line discipline) */
cc_t c_cc[nccs]; /* 控制特性 */
};

这个档案也包含所有的旗标定义. 输入模式旗标在 c_iflag 掌管所有的输入处理, 这就意谓著由装置上传来的字元在还没用 read 功能读取前可以先处理过. 同理 c_oflag 掌管所有的输出处理. c_cflag 包含连接埠的设定, 如 鲍率, 每字元多少位元, 停止位元, 等等.. 区域模式旗标放在 c_lflag 用来侦测字元是否回应, 而讯号会送到你的程式, 等等.. 最後 c_cc 阵列定义了档案终了的控制字元, 停止, 等等.. 预设的控制字元值放在 . 有关旗标的细节摆在使用手册 termios(3). termios 结构体内的 c_line 行控制 (line discipline) 元素, 不能在 posix 相容的系统下使用译者注:这里所说的 line discipline 虽然我翻成 行控制但还是很难说出那是舍. 如果想知道请看看 kernel :( .


序列装置的输入观念
有三个输入的观念要说明. 按照所要写的应用程式选用适合的观念. 尽量避免使用回圈来读取单一的字元再组成字串. 我曾这样做过, 会掉字元, 且对 read 而言不会显示任何错误.


标准输入程序
这是终端机的标准处理程序, 但用来与其他 dl 型式的以行为单位的输入通讯也很有用, 也就是 read 会传回一整行完整的输入资料. 行预设的终止字元是 nl (ascii lf), 档案结束符, 或行终止字元. 预设环境下, cr (是 dos/windows 预设的行终止符) 不会终止一行的叙述.

标准的输入处理程序还可以处理 清除, 删除字, 重印字元, 及转换 cr 为 nl 等等功能..


非标准输入程序
非标准输入程序可以用在需要每次读取固定数量字元的情况, 并允许使用字元输入时间的计时器. 这种模式可以用在读取固定字元数量的应用程式, 或者所连接的装置会突然送出大量字元的状况.

非同步式输入
以上所叙述的两种模式都可以用在非同步与同步的传输模式. 预设是在同步的模式下工作, 也就是在尚未读取完之前, read 的状态会被阻断. 而非同步模式下 read 的状态会直接返回并送出讯号到所叫用的程式直到完成工作. 这个讯号可以由讯号的处理程式 handler...来接收.


等待来自多个讯号来源的输入
这并不是一个

相关IC型号
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!