ESM335x系列工控主板支持5路高速串口,其中COM2口支持硬件RTS/CTS流控功能,其RTS/CTS分别与ESM335x的GPIO1/GPIO0复用,应用程序可以独立设置是否使能RTS/CTS功能。
RTS(Request-To-Send)流量控制功能由串口参数结构体DCB的fRtsControl成员设置,该成员的可用值如下(针对ESM335x):
值 | 说明 |
RTS_CONTROL_DISABLE | 禁止RTS功能,对应管脚可作为GPIO使用 |
RTS_CONTROL_HANDSHAKE | 启用RTS握手功能。当串口硬件输入缓冲区字符数大于40时,RTS输出高,小于24个字符时,RTS输出低 |
RTS_CONTROL_TOGGLE | 当发送数据时,RTS信号线被驱动为低,缓冲区数据发送完后,RTS信号为被驱动高 |
串口参数结构体DCB的fOutxCtsFlow成员用于指定CTS(Clear-To-Send)信号是否被监视并作为输出流量控制信号。如果此成员设置为TRUE且CTS管脚为高,则串口输出被挂起,直到CTS被拉低后重新输出。如果此成员设置为FALSE,对应管脚可作为GPIO使用。
RTS Handshake与OutxCtsFlow通常是同时使能或同时禁止的,下面是设置RTS/CTS的示例代码:
BOOL CCESerial::SetHandshake( BOOL bSet )
{
DCB dcb;
GetCommState( m_hSer, &dcb );
// Purge any pending characters in the serial port.
PurgeComm(m_hSer, (PURGE_TXABORT|PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR));
if( bSet )
{
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxCtsFlow = TRUE;
}
else
{
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow = FALSE;
}
returnSetCommState(m_hSer, &dcb);
}
除COM2口支持硬件流控外,ESM335x的所有串口(包括COM2)还支持 RTS Toggle功能,RTS Toggle主要用于RS485电路的数据收发方向控制,应用程序可以选择ESM335x 32位GPIO中的任意一位做为RTS信号线来实现RTS Toggle功能,下面是选择GPIO作为串口RTS信号并使能RTS_CONTROL_TOGGLE的示例代码:
BOOL CCESerial::SetRTSToggle( DWORD dwRTSPin )
{
DCB dcb;
BOOL bRet;
bRet = DeviceIoControl(m_hSer, // file handle to the driver
IOCTL_SET_UART_RTS_PIN, // I/O control code
&dwRTSPin, // in buffer
sizeof(DWORD), // in buffer size
NULL, // out buffer
0, // out buffer size
NULL, // pointer to number of bytes returned
NULL); // ignored (=NULL)
if( !bRet )
returnFALSE;
GetCommState( m_hSer, &dcb );
// Purge any pending characters in the serial port.
PurgeComm(m_hSer, (PURGE_TXABORT |PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR));
dcb.fRtsControl = RTS_CONTROL_TOGGLE;
SetCommState(m_hSer, &dcb);
returnTRUE;
}
完整的串口例程请与英创工程师联系获取。
全部0条评论
快来发表一下你的评论吧 !