串口补充2

串口流量控制:

在串口协议中规定了传输数据的速率,即单位时间内传输的字节数。根据不同的传输速率,在接收端和发送端可以进行流量控制。接收端如果接收缓冲区满了,向发送端发出暂停发送信号;等接收缓冲区数据被取走后,向发送端发出继续发送信号:发送端收到暂停发送信号后停止数据发送,直到收到继续发送信号才会再次发送数据。

串口协议中规定了硬件流量控制(RTS/CTS 和DTR/CTS)和软件流量控制(XON/OFF) 

硬件流量控制:

RTS/CTS 称做“请求发送/清除发送”流量控制。使用时需要连接串口电缆两端RTS和CTS控制线RTS/CTS流量控制方式中终端是流量发起方。 DTR/DSR 称做“数据终端就绪/数据设置就绪”流量控制。

软件流量控制:

使用软件流量控制的串口通信电缆只需要连接三条数据线(数据发送、数据接收、地线)即可,软件流量控制使用XON/XOFF协议。软件流量控制使用特殊的字符表示硬件流量控制中的CTS信号。在软件流量控制中,首先设置数据接收缓冲高位和低位。当接收端数据流量超过高位的时候,接收端向发送端发出XOFF字符,XOFF字符通常是十进制数19,表示停止数据发送;当接收端数据缓冲数据低于低位的时候,接收端向发送端发送XON字符(通常是十进制数17),表示开始数据传输。

termios.h头文件为termios结构提供了一组设置的函数,函数定义如下: 

int tcgetattr (int fd, struct termios *termios_p);int tcsetattr (int fd, int optional_actions, struct termios *termios_p);

tcgetattr()函数和tcsetattr()函数,参数fd指向已打开的串口设备句柄, termios_p指向存放串口参数的termios结构首地址。tcsetattr()函数中,参数optional_actions指定了参数什么时候起作用: TCSANOW表示立即生效;TCSADRAIN表示在fd上所有的输出都被传输后生效; TCSAFLUSH表示所有引用fd对象的数据都在传输出去后生效。 

int tcsendbreak (int fd, int duration) ;
tcsendbreak()函数传送连续的0值比特流,持续一段时间。如果终端使用异步串行数据传输且duration是0,它至少传输0.25秒,不会超过0.5秒。如果duration非0,它发送的时间长度由实现定义。

int tcdrain (int fd);
tcdrain()函数会等待直到所有写入fd 引用对象的输出都被传输。

int tcflush (int fd, int queue selector);
tcflush()函数丢弃要写入引用的对象但是尚未传输的数据,或者收到但是尚未读取的数据,取决于参数queue_selector的值: 

int tcflow (int fd, int action);
tcflow()函数挂起fd引用对象上的数据传输或接收,取决于action的值:

int cfmakeraw (struct termios *termios_p);
cfmakeraw()函数设置终端属性为原始数据方式,相当于对参数termios_p配置: 

speed_t cfgetispeed (struct termios *termios_p);

speed_t cfgetospeed (struct termios *termios p);

int cfsetispeed (struct termios *termios_p, speed_t speed);

int cfsetospeed (struct termios *termios p, speed t speed); 
cfgetispeed()函数和 cfgetospeed()函数用来得到串口的输入和输出速率,参数termios_p指向termios结构的内存首地址
通常Linux系统对串口的设置主要是通过termios这个结构体实现的,但是这个结构体却没有提供控制RTS或获得CTS等串口引脚状态的接口,可以通过ioctl系统调用来获得或控制。

/*获得CTS状态*/
ioctl (fd, TIOCMGET, &controlbits);
if (controlbits & TIOCM CTS)
printf ("有信号\n");
else
printf ("无信号\n");

/*设置RTS状态*/
ioctl (fd, TIOCMGET, &ctrlbits);
if (ctrlbits&TIOCM RTS)
ctrlbits |= TIOCM RTS;
else
ctrlbits &= ~TIOCM RTS;
ioctl (fd, TIOCMSET, &ctrlbits);//设置RTS//取消RTS 

应用案例与windows终端通信

串口补充2

串口补充2 

 

上一篇:linux源码解读(二十四):进程间通信IPC方式对比&poll接受数据


下一篇:asmca -silent -creatediskgroup在语法上的几点注意事项