Baud definitions (B9600 for example) are again encoded; Now supports the BOTHER settings which allows specifying the baud via c_ispeed and c_ospeed termios fields

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4970 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-07-23 15:37:13 +00:00
parent 6071b29253
commit 713497f886
3 changed files with 26 additions and 48 deletions

View File

@ -24,15 +24,6 @@ config MB_TCP_ENABLED
depends on MODBUS
default y
config MB_TERMIOS
bool "Driver TERMIOS supported"
depends on MB_ASCII_ENABLED || MB_RTU_ENABLED
default n
---help---
Serial driver supports termios.h interfaces (tcsetattr, tcflush, etc.).
If this is not defined, then the terminal settings (baud, parity, etc).
are not configurable at runtime; serial streams will not be flushed when closed.
config MB_ASCII_TIMEOUT_SEC
int "Character timeout"
depends on MB_ASCII_ENABLED

View File

@ -60,10 +60,6 @@ The NuttX-named configuration options that are available include:
CONFIG_MB_ASCII_ENABLED - Modbus ASCII support
CONFIG_MB_RTU_ENABLED - Modbus RTU support
CONFIG_MB_TCP_ENABLED - Modbus TCP support
CONFIG_MB_TERMIOS - Serial driver supports termios.h interfaces (tcsetattr,
tcflush, etc.). If this is not defined, then the terminal settings (baud,
parity, etc.) are not configurable at runtime; serial streams will not be
flushed when closed.
CONFIG_MB_ASCII_TIMEOUT_SEC - Character timeout value for Modbus ASCII. The
character timeout value is not fixed for Modbus ASCII and is therefore
a configuration option. It should be set to the maximum expected delay
@ -106,6 +102,13 @@ The NuttX-named configuration options that are available include:
CONFIG_MB_FUNC_READWRITE_HOLDING_ENABLED - If the Read/Write Multiple
Registers function should be enabled.
See also other serial settings, in particular:
CONFIG_SERIAL_TERMIOS - Serial driver supports termios.h interfaces (tcsetattr,
tcflush, etc.). If this is not defined, then the terminal settings (baud,
parity, etc.) are not configurable at runtime; serial streams will not be
flushed when closed.
Note
====

View File

@ -35,7 +35,7 @@
#include <unistd.h>
#include <assert.h>
#ifdef CONFIG_MB_TERMIOS
#ifdef CONFIG_SERIAL_TERMIOS
# include <termios.h>
#endif
@ -65,7 +65,7 @@ static uint8_t ucBuffer[BUF_SIZE];
static int uiRxBufferPos;
static int uiTxBufferPos;
#ifdef CONFIG_MB_TERMIOS
#ifdef CONFIG_SERIAL_TERMIOS
static struct termios xOldTIO;
#endif
@ -84,7 +84,7 @@ void vMBPortSerialEnable(bool bEnableRx, bool bEnableTx)
if (bEnableRx)
{
#ifdef CONFIG_MB_TERMIOS
#ifdef CONFIG_SERIAL_TERMIOS
(void)tcflush(iSerialFd, TCIFLUSH);
#endif
uiRxBufferPos = 0;
@ -112,9 +112,8 @@ bool xMBPortSerialInit(uint8_t ucPort, uint32_t ulBaudRate,
char szDevice[16];
bool bStatus = true;
#ifdef CONFIG_MB_TERMIOS
struct termios xNewTIO;
speed_t xNewSpeed;
#ifdef CONFIG_SERIAL_TERMIOS
struct termios xNewTIO;
#endif
snprintf(szDevice, 16, "/dev/ttyS%d", ucPort);
@ -125,7 +124,7 @@ bool xMBPortSerialInit(uint8_t ucPort, uint32_t ulBaudRate,
szDevice, errno);
}
#ifdef CONFIG_MB_TERMIOS
#ifdef CONFIG_SERIAL_TERMIOS
else if (tcgetattr(iSerialFd, &xOldTIO) != 0)
{
vMBPortLog(MB_LOG_ERROR, "SER-INIT", "Can't get settings from port %s: %d\n",
@ -163,35 +162,20 @@ bool xMBPortSerialInit(uint8_t ucPort, uint32_t ulBaudRate,
bStatus = false;
}
switch (ulBaudRate)
{
case 9600:
xNewSpeed = B9600;
break;
case 19200:
xNewSpeed = B19200;
break;
case 38400:
xNewSpeed = B38400;
break;
case 57600:
xNewSpeed = B57600;
break;
case 115200:
xNewSpeed = B115200;
break;
default:
bStatus = false;
}
if (bStatus)
{
if (cfsetispeed(&xNewTIO, xNewSpeed) != 0)
{
vMBPortLog(MB_LOG_ERROR, "SER-INIT", "Can't set baud rate %ld for port %s: %d\n",
ulBaudRate, errno);
}
else if (cfsetospeed(&xNewTIO, xNewSpeed) != 0)
/* Set the new baud using the (non-standard) BOTHER mechanism
* supported by NuttX.
*/
xNewTIO.c_ispeed = (speed_t)ulBaudRate;
xNewTIO.c_ospeed = (speed_t)ulBaudRate;
/* NOTE: In NuttX, cfset[i|o]speed always return OK. Failures will
* only be reported when tcsetattr() is called.
*/
if (cfsetispeed(&xNewTIO, BOTHER) != 0 || cfsetospeed(&xNewTIO, BOTHER) != 0)
{
vMBPortLog(MB_LOG_ERROR, "SER-INIT", "Can't set baud rate %ld for port %s: %d\n",
ulBaudRate, szDevice, errno);
@ -231,7 +215,7 @@ void vMBPortClose(void)
{
if (iSerialFd != -1)
{
#ifdef CONFIG_MB_TERMIOS
#ifdef CONFIG_SERIAL_TERMIOS
(void)tcsetattr(iSerialFd, TCSANOW, &xOldTIO);
#endif
(void)close(iSerialFd);