教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 综合文档 >

Linux串口编程详解(5)

来源:网络收集 时间:2026-01-20
导读: { char buffer[255]; /* Input buffer */ char *bufptr; /* Current char in buffer */ int nbytes; /* Number of bytes read */ int tries; /* Number of tries so far */ for (tries = 0; tries /* send an AT co

{

char buffer[255]; /* Input buffer */

char *bufptr; /* Current char in buffer */ int nbytes; /* Number of bytes read */ int tries; /* Number of tries so far */

for (tries = 0; tries < 3; tries ++) {

/* send an AT command followed by a CR */ if (write(fd, \ continue;

/* read characters into our string buffer until we get a CR or NL */ bufptr = buffer;

while ((nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1)) > 0) {

bufptr += nbytes;

if (bufptr[-1] == '\\n' | bufptr[-1] == '\\r') break; }

/* nul terminate the string and see if we got an OK response */

*bufptr = '\\0';

if (strncmp(buffer, \ return (0); }

return (-1); }

标准调制解调器命令 ?

大多数调制解调器都支持“AT”命令集。之所以这样叫是因为这个命令集中的每个命令都是以“AT”字符开头。每个命令都是以第一列的AT开头字符后面跟上特殊命令参数和一个回车符CR(八进制015)。调制解调器处理完这条命令之后会根据命令回复一些文本消息。

?

ATD 拨号 [#b39592a6]

通过ATD命令可以拨打一个指定号码。除过号码和分隔符(-)以外,你还可以指定以音频(\)或者脉冲(\)方式拨号,暂停一秒(\)和等待拨号音(\):

ATDT 555-1212

ATDT 18008008008W1234,1,1234 ATD T555-1212WP1234

调制解调器可能回复下面列出的某个消息:

NO DIALTONE BUSY

NO CARRIER CONNECT

CONNECT baud

?

ATH 挂断

通过ATH命令可以让调制解调器挂断。因为,调制解调器如果在“命令”模式的话,你可能就不能打普通电话了。

如果DTR信号线掉了的话,大部分调制解调器也会挂断。你可以将波特率设置成0并且持续至少1秒来做到这一点。再次让DTR掉落同样也可以把调制解调器重新拉回命令模式。 调制解调器成功挂断以后,它会回复一个\回来。如果调制解调器仍然保持连接,它则会发送\或者\这样的消息。

?

ATZ 重置调制解调器

通过ATZ命令可以重置调制解调器。重置之后它会回复字符串\。

?

与调制解调器通讯的常见问题

首先,也是最重要的一点,千万不要使用回声输入(input echoing)。回声输入会导致调制解调器和计算机之间产生反馈循环。

其次,当发送调制解调器命令时,命令必须以回车(CR)而不是换行(NL)结束。C语言中回车的字符常量是\。

最后,处理调制解调器通讯的时候,要一定保证你使用了调制解调器支持的波特率。虽然大多数调制解调器都支持自动探测波特率,但你也会注意到某些(通常是19.2kbps或者比较老的调制解调器)有局限性。

高级串口编程 ?

所谓高级串口编程其实说的就是使用更直接的底层的ioctl(2)和select(2)系统调用来操作串口。

串口的ioctl ?

前文中曾经提到使用tcgetattr和tcsetattr函数来配置串口。UNIX环境下,这些函数都是使用ioctl(2)系统调用来实现的。 系统调用ioctl可以带三个参数:

int ioctl(int fd, int request, ...);

显然,fd参数对于串口编程来说就是串口设备文件的文件描述符咯。而request参数是在头文件中定义的常量,而且一般不会超出下表所列的范围。

串口的IOCTL请求

REQUEST TCGETS TCSETS

描述

Gets the current serial port settings. Sets the serial port settings immediately.

POSIX函数 tcgetattr

tcsetattr(fd, TCSANOW, &options)

TCSETSF

Sets the serial port settings after flushing the input tcsetattr(fd, and output buffers.

TCSAFLUSH, &options)

TCSETSW TCSBRK TCXONC TCFLSH

Sets the serial port settings after allowing the input tcsetattr(fd, and output buffers to drain/empty. Sends a break for the given time. Controls software flow control.

Flushes the input and/or output queue.

TCSADRAIN, &options) tcsendbreak, tcdrain tcflow tcflush None None None

TIOCMGET Returns the state of the \TIOCMSET Sets the state of the \

FIONREAD Returns the number of bytes in the input buffer.

取得控制信号 ?

TIOCMGET ioctl可以取得当前调制解调器的状态位。这个状态位囊括了除去RXD和TXD信号线的所有RS-232信号,这些都在下表中列出。

控制信号常量

常量 TIOCM_LE

描述

DSR (data set ready/line enable)

TIOCM_DTR DTR (data terminal ready) TIOCM_RTS RTS (request to send) TIOCM_ST TIOCM_SR

Secondary TXD (transmit) Secondary RXD (receive)

TIOCM_CTS CTS (clear to send) TIOCM_CAR DCD (data carrier detect) TIOCM_CD

Synonym for TIOCM_CAR

TIOCM_RNG RNG (ring) TIOCM_RI

Synonym for TIOCM_RNG

TIOCM_DSR DSR (data set ready)

例如下面这个程序片段,你可以通过给ioctl带一个用来保存状态位的整形变量的指针来取得状态位。

#include #include

int fd;

int status;

ioctl(fd, TIOCMGET, &status);

设置控制信号 ?

TIOCMSET ioctl可以设置上面定义的调制解调器状态位。下面的例子展示如何使用它来将DTR信号线设成掉线状态。

#include #include

int fd;

int status;

ioctl(fd, TIOCMGET, &status);

status &= ~TIOCM_DTR;

ioctl(fd, TIOCMSET, &status);

可能被设置的状态位取决于操作系统,驱动和正在使用的模式。关于更详细的信息应该去看以下你所使用的操作系统的文档。

…… 此处隐藏:590字,全部文档内容请下载后查看。喜欢就下载吧 ……
Linux串口编程详解(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/402717.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)