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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]和\[2\]中的代码片段展示了关于STM32G0系列中USART2串口的配置和中断处理函数的代码。这段代码中,USART2_IRQHandler函数是USART2串口的中断处理函数,用于处理接收中断。在该函数中,通过判断接收寄存器非空标志位(UART_FLAG_RXNE)是否被置位来判断是否有数据接收到。如果有数据接收到,就将接收到的数据存储到接收缓冲区(RS485_RX_BUF)中,并增加接收数据计数器(RS485_RX_CNT)。同时,通过调用HAL_UART_IRQHandler函数来处理USART2串口的其他中断,并在函数末尾通过调用__HAL_UART_ENABLE_IT函数来重新开启接收中断。 引用\[3\]中的代码片段是对上述代码的补充说明。在这段代码中,作者提到了一个重要的问题,即在初始化配置中不能使用HAL_UART_Receive_IT函数来开启接收中断,否则会导致接收到的第一个数据始终为0xB4。作者建议将HAL_UART_Receive_IT函数的调用注释掉,以避免这个问题。 综上所述,这些代码片段展示了在STM32G0系列中配置和处理USART2串口的相关代码,其中包括了中断处理函数和一些注意事项。 #### 引用[.reference_title] - *1* *2* *3* [STM32G030C8T6 串口调试 (中断接收,prinf发送)使用cubemx+keil](https://blog.csdn.net/moxiaoxiong/article/details/118399345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值