ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

串口补充2

2022-02-20 13:00:35  阅读:233  来源: 互联网

标签:补充 termios 发送 int fd RTS 串口


串口流量控制:

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

串口协议中规定了硬件流量控制(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终端通信

 

 

标签:补充,termios,发送,int,fd,RTS,串口
来源: https://blog.csdn.net/qqqcccjjj/article/details/123028643

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有