Modbus RTU/ASCII/TCP with lwip TCP working partial, but with errors (retransmitions)
Dependencies: EthernetNetIf mbed
Diff: ModBus/portserial.cpp
- Revision:
- 0:f54e9507171b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ModBus/portserial.cpp Mon Dec 05 22:49:02 2011 +0000 @@ -0,0 +1,146 @@ +/* + * FreeModbus Libary: BARE Port + * Copyright (C) 2006 Christian Walter <wolti@sil.at> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * File: $Id: portserial.c,v 1.1 2006/08/22 21:35:13 wolti Exp $ + */ + +/* ----------------------- System includes ----------------------------------*/ +#include "mbed.h" // Cam + +/* ----------------------- Platform includes --------------------------------*/ +#include "port.h" + +/* ----------------------- Modbus includes ----------------------------------*/ +#include "mb.h" +#include "mbport.h" + +DigitalOut RXLed(LED2); +DigitalOut TXLed(LED3); +Timeout RXTimeout; +Timeout TXTimeout; + +void RXTimeoutFunc(void) +{ + RXLed = 0; +} + +void TXTimeoutFunc(void) +{ + TXLed = 0; +} + +/* ----------------------- static functions ---------------------------------*/ +static void prvvUARTTxReadyISR( void ); +static void prvvUARTRxISR( void ); +static void prvvUARTISR( void ); + +/* ----------------------- System Variables ---------------------------------*/ +Serial pc(USBTX, USBRX); // Cam - mbed USB serial port + +Ticker simISR; // Cam - mbed ticker + // we don't have the TX buff empty interrupt, so + // we just interrupt every 1 mSec and read RX & TX + // status to simulate the proper ISRs. + +static BOOL RxEnable, TxEnable; // Cam - keep a static copy of the RxEnable and TxEnable + // status for the simulated ISR (ticker) + + +/* ----------------------- Start implementation -----------------------------*/ +// Cam - This is called every 1mS to simulate Rx character received ISR and +// Tx buffer empty ISR. +static void +prvvUARTISR( void ) +{ + if (TxEnable) + { + if(pc.writeable()) + prvvUARTTxReadyISR(); + } + if (RxEnable) + { + if(pc.readable()) + prvvUARTRxISR(); + } +} + +void +vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable ) +{ + /* If xRXEnable enable serial receive interrupts. If xTxENable enable + * transmitter empty interrupts. + */ + RxEnable = xRxEnable; + TxEnable = xTxEnable; +} + +BOOL +xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ) +{ + simISR.attach_us(&prvvUARTISR,1000); // Cam - attach prvvUARTISR to a 1mS ticker to simulate serial interrupt behaviour + // 1mS is just short of a character time at 9600 bps, so quick enough to pick + // up status on a character by character basis. + return TRUE; +} + +BOOL +xMBPortSerialPutByte( CHAR ucByte ) +{ + /* Put a byte in the UARTs transmit buffer. This function is called + * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been + * called. */ + pc.putc( ucByte); + TXLed = 1; + TXTimeout.attach(TXTimeoutFunc, 0.020); + return TRUE; +} + +BOOL +xMBPortSerialGetByte( CHAR * pucByte ) +{ + /* Return the byte in the UARTs receive buffer. This function is called + * by the protocol stack after pxMBFrameCBByteReceived( ) has been called. + */ + * pucByte = pc.getc(); + RXLed = 1; + RXTimeout.attach(RXTimeoutFunc, 0.020); + return TRUE; +} + +/* Create an interrupt handler for the transmit buffer empty interrupt + * (or an equivalent) for your target processor. This function should then + * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that + * a new character can be sent. The protocol stack will then call + * xMBPortSerialPutByte( ) to send the character. + */ +static void prvvUARTTxReadyISR( void ) +{ + pxMBFrameCBTransmitterEmpty( ); +} + +/* Create an interrupt handler for the receive interrupt for your target + * processor. This function should then call pxMBFrameCBByteReceived( ). The + * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the + * character. + */ +static void prvvUARTRxISR( void ) +{ + pxMBFrameCBByteReceived( ); +} + +