Linux串口编程详解(5)

2019-07-29 10:59

{

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);

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


Linux串口编程详解(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:MA5680T新规范(华为OLT配置模板)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: