Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages   Examples  

rs232d/rs232d.c

Simple RS232 server. Use a serial cable to connect the RS232 port of the Ethernut Board with a COM port of a PC. Start a terminal program and a telnet client on the PC. Telnet should connect to the Ethernut Board.

Characters typed in the telnet window will appear in the terminal program window and vice versa.

#include <string.h>

#include <dev/nicrtl.h>
#include <dev/uartavr.h>

#include <sys/heap.h>
#include <sys/thread.h>
#include <sys/timer.h>
#include <sys/print.h>

#include <netinet/sostream.h>
#include <arpa/inet.h>

volatile u_char connected = 0;

volatile TCPSOCKET *sock;
NUTDEVICE *uart;

u_char rxbuff[256];
u_char txbuff[256];

/*
 * From RS232 to socket.
 */
THREAD(Receiver, arg)
{
    int rlen;
    int slen;
    int c;

    for(;;) {
        if(connected)
            if((rlen = NutDeviceRead(uart, rxbuff, sizeof(rxbuff))) > 0)
                for(c = 0; connected && c < rlen; c += slen) 
                    if((slen = NutTcpSend(sock, rxbuff + c, rlen - c)) < 0)
                        connected = 0;
        NutThreadYield();
    }
}

/*
 * From socket to RS232.
 */
void Transmitter(void)
{
    int rlen;
    int slen;
    int c;

    connected = 1;
    while(connected) {
        if((rlen = NutTcpReceive(sock, txbuff, sizeof(txbuff))) < 0)
            break;
        for(c = 0; connected && c < rlen; c += slen) {
            if((slen = NutDeviceWrite(uart, txbuff + c, rlen - c)) < 0)
                break;
            NutDeviceWrite(uart, 0, 0);
        }
        NutThreadYield();
    }
    connected = 0;
}

/*
 * Main application routine. 
 *
 * Nut/OS automatically calls this entry after initialization.
 */
THREAD(NutMain, arg)
{
    u_long baud = 9600;

    NutRegisterDevice(&devUart0, 0, 0);
    uart = NutDeviceOpen("uart0");
    NutDeviceIOCtl(uart, UART_SETSPEED, &baud);

    /*
     * Register Realtek controller at address 8300 hex
     * and interrupt 5.
     */
    NutRegisterDevice(&devEth0, 0x8300, 5);

    /*
     * Configure lan interface. 
     *
     */
    NutNetAutoConfig("eth0");
    NutThreadCreate("xmit", Receiver, 0, 1024);

    /*
     * Now loop endless for connections.
     */
    for(;;) {
        /*
         * Create a socket.
         */
        sock = NutTcpCreateSocket();

        /*
         * Listen on telnet port. If we return,
         * we got a client.
         */
        NutTcpAccept(sock, 23);

        /*
         * Call RS232 transmit routine.
         */
        Transmitter();

        /*
         * Close our socket.
         */
        NutTcpCloseSocket(sock);
    }
}

© 2000-2002 by egnite Software GmbH - visit http://www.ethernut.de/