summaryrefslogtreecommitdiff
path: root/apps/modbus
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-07-23 15:37:13 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-07-23 15:37:13 +0000
commit6355e50a2289d7d764ac9de87ddd1528c510bd8f (patch)
treebdace79b95ff390c7c1b0ccdd005816be2c83e6c /apps/modbus
parent92ee042ea3f2cd97bcca3f1d752ec68dac919d85 (diff)
downloadnuttx-6355e50a2289d7d764ac9de87ddd1528c510bd8f.tar.gz
nuttx-6355e50a2289d7d764ac9de87ddd1528c510bd8f.tar.bz2
nuttx-6355e50a2289d7d764ac9de87ddd1528c510bd8f.zip
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
Diffstat (limited to 'apps/modbus')
-rw-r--r--apps/modbus/Kconfig9
-rw-r--r--apps/modbus/README.txt11
-rw-r--r--apps/modbus/nuttx/portserial.c54
3 files changed, 26 insertions, 48 deletions
diff --git a/apps/modbus/Kconfig b/apps/modbus/Kconfig
index d4c93fdae..da95abf6a 100644
--- a/apps/modbus/Kconfig
+++ b/apps/modbus/Kconfig
@@ -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
diff --git a/apps/modbus/README.txt b/apps/modbus/README.txt
index 46b6b2b0e..c7a8ef245 100644
--- a/apps/modbus/README.txt
+++ b/apps/modbus/README.txt
@@ -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
====
diff --git a/apps/modbus/nuttx/portserial.c b/apps/modbus/nuttx/portserial.c
index bf862bd22..bf1f4526a 100644
--- a/apps/modbus/nuttx/portserial.c
+++ b/apps/modbus/nuttx/portserial.c
@@ -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);