串口补充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终端通信

 

 

版权声明:本文为CSDN博主「qqqcccjjj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qqqcccjjj/article/details/123028643

串口流量控制:

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

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

 

 

版权声明:本文为CSDN博主「qqqcccjjj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qqqcccjjj/article/details/123028643

生成海报
点赞 0

qqqcccjjj

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

串口补充2

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

Arduino入门教程

Arduino编译环境下载 当前最新版ArduinoIDE 下载地址: Software | Arduino 认识Arduino IDE 点亮13号引脚的LED灯,持续一秒,然后灭掉,再持续一秒

基于运放的电压放大电路设计

基于集成运放设计一传感器信号采集电路。传感器输出信号为交流形式,峰峰值在100mV以内,频率为1000Hz以内,模数转换器允许输入电压在0~3V,要求设计传感器与模数转换器之间的信号采集电

华大MCU的IAP升级

折腾了些时间,总算解决了 芯片型号是HC32F460,用串口实现IAP升级,从21IC论坛中找到了同样的IAP升级源码,下载后,在自己的开发板上测试也没问题,阅读源码发现,作者的源码中串口通信部分没有用中断。 不过像这样的IAP程序也没有