📄 rs232d.c
字号:
/*! * Copyright (C) 2001-2005 by egnite Software GmbH. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor the names of * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY EGNITE SOFTWARE GMBH AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL EGNITE * SOFTWARE GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * For additional information see http://www.ethernut.de/ *//*! * $Log: rs232d.c,v $ * Revision 1.4 2005/11/22 09:14:13 haraldkipp * Replaced specific device names by generalized macros. * * Revision 1.3 2004/09/10 10:26:35 haraldkipp * Removed old header files * * Revision 1.2 2003/11/04 17:46:52 haraldkipp * Adapted to Ethernut 2 * * Revision 1.1 2003/08/05 18:59:05 haraldkipp * Release 3.3 update * * Revision 1.7 2003/02/04 18:19:39 harald * Version 3 released * * Revision 1.6 2003/02/04 16:24:34 harald * Adapted to version 3 * * Revision 1.5 2002/10/31 16:25:48 harald * Mods by troth for Linux * * Revision 1.3 2002/06/26 17:29:03 harald * First pre-release with 2.4 stack * * Revision 1.2 2002/06/12 11:22:55 harald * *** empty log message *** * * Revision 1.1 2002/06/04 19:00:49 harald * First check in * *//*! * \example 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. Baudrate is 9600. * */#include <dev/board.h>#include <sys/heap.h>#include <sys/thread.h>#include <sys/timer.h>#include <sys/socket.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <io.h>#include <fcntl.h>#include <arpa/inet.h>#include <pro/dhcp.h>#define BUFFERSIZE 128#define TCPPORT 23typedef struct { FILE *cd_rs232; FILE *cd_tcpip; char cd_connected;} CHANNEL;/* * Transfer data from input stream to output stream. */void StreamCopy(FILE * istream, FILE * ostream, char *cop){ int cnt; char *buff; buff = malloc(BUFFERSIZE); while (*cop) { if ((cnt = fread(buff, 1, BUFFERSIZE, istream)) <= 0) break; if (*cop && (cnt = fwrite(buff, 1, cnt, ostream)) <= 0) break; if (*cop && fflush(ostream)) break; } *cop = 0; free(buff);}/* * From RS232 to socket. */THREAD(Receiver, arg){ CHANNEL *cdp = arg; for (;;) { if (cdp->cd_connected) { NutThreadSetPriority(64); /* * We are reading from the UART without any timeout. So we * won't return immediately when disconnected. */ StreamCopy(cdp->cd_rs232, cdp->cd_tcpip, &cdp->cd_connected); NutThreadSetPriority(128); } NutThreadYield(); }}/* * Main application routine. * * Nut/OS automatically calls this entry after initialization. */int main(void){ TCPSOCKET *sock; CHANNEL cd; u_long baud = 9600; /* * Register our devices. */ NutRegisterDevice(&DEV_UART, 0, 0); NutRegisterDevice(&DEV_ETHER, 0x8300, 5); /* * Setup the uart device. */ cd.cd_rs232 = fopen(DEV_UART_NAME, "r+b"); _ioctl(_fileno(cd.cd_rs232), UART_SETSPEED, &baud); /* * Setup the ethernet device. Try DHCP first. If this is * the first time boot with empty EEPROM and no DHCP server * was found, use hardcoded values. */ if (NutDhcpIfConfig(DEV_ETHER_NAME, 0, 60000)) { /* No valid EEPROM contents, use hard coded MAC. */ u_char my_mac[] = { 0x00, 0x06, 0x98, 0x20, 0x00, 0x00 }; if (NutDhcpIfConfig("eth0", my_mac, 60000)) { /* No DHCP server found, use hard coded IP address. */ u_long ip_addr = inet_addr("192.168.192.100"); u_long ip_mask = inet_addr("255.255.255.0"); NutNetIfConfig("eth0", my_mac, ip_addr, ip_mask); /* If not in a local network, we must also call NutIpRouteAdd() to configure the routing. */ } } /* * Start a RS232 receiver thread. */ NutThreadCreate("xmit", Receiver, &cd, 512); /* * Now loop endless for connections. */ cd.cd_connected = 0; for (;;) { /* * Create a socket and listen for a client. */ sock = NutTcpCreateSocket(); NutTcpAccept(sock, TCPPORT); /* * Open a stdio stream assigned to the connected socket. */ cd.cd_tcpip = _fdopen((int) sock, "r+b"); cd.cd_connected = 1; /* * Call RS232 transmit routine. On return we will be * disconnected again. */ StreamCopy(cd.cd_tcpip, cd.cd_rs232, &cd.cd_connected); /* * Close the stream. */ fclose(cd.cd_tcpip); /* * Close our socket. */ NutTcpCloseSocket(sock); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -