#01/16/13 The best solution is to do the KISS initialization via a binary program. I found one such program and I've made the sources available here: http://www.trinityos.com/HAM/CentosDigitalModes/usr/src/misc/D710/ The following website has C-code available to: - change the frequecy - change the selected MEMORY - configure the TNC - check the status and firmware version http://iz6rdb.trentalancia.com/en/tm-d710_control.html This works reasonably well but the binary program is far superior! ------------------------------------------------------------------ (stty -F /dev/ttyS0 ispeed 9600 ospeed 9600 -ignpar cs8 -cstopb -echo; echo -e "HBAUD 9600\n"; ) /dev/ttyS0 (stty -F /dev/ttyS0 ispeed 9600 ospeed 9600 -ignpar cs8 -cstopb -echo; echo -e "HBAUD 1200\n"; ) /dev/ttyS0 (stty -F /dev/ttyS0 ispeed 9600 ospeed 9600 -ignpar cs8 -cstopb -echo; echo -e "KISS ON\n"; ) /dev/ttyS0 (stty -F /dev/ttyS0 ispeed 9600 ospeed 9600 -ignpar cs8 -cstopb -echo; echo -e "RESTART\n"; ) /dev/ttyS0 This doesn't exit nicely http://www.comptechdoc.org/os/linux/programming/c/linux_pgcserial.html -- -- Example serial code: would work but hard coded http://www.captain.at/howto-simple-serial-port-test-example.php --------------------------------------------------------------- ser: Send and receive characters via the serial port on Linux. This example will send 3 characters (ABC) over the serial port and try to receive them again. This is very handy for testing embedded hardware, e.g. the Atmel ATmega16 Serial Port Example or PIC - MMC Flash Memory Extension where one needs a reliable example for testing. To test this example itself, use a serial loopback dongle - just connect TX (transmit data) and RX (receive data) pins on the serial port - see Serial (RS232) Port Pins and Registers Save all files to your project directory or download ser.tar.gz here and use "make" to compile it. Makefile CFLAGS=-g -Wall ser: captain/capser.c ser.c gcc -g -c -Wall captain/capser.c -o capser.o gcc -g -c -Wall ser.c -o ser.o gcc ser.o capser.o -o ser ser.c /* ser.c (C) 2004-5 Captain http://www.captain.at Sends 3 characters (ABC) via the serial port (/dev/ttyS0) and reads them back if they are returned from the PIC. Used for testing the PIC-MMC test-board http://www.captain.at/electronic-index.php */ #include /* Standard input/output definitions */ #include /* String function definitions */ #include /* UNIX standard function definitions */ #include /* File control definitions */ #include /* Error number definitions */ #include /* POSIX terminal control definitions */ #include "captain/capser.h" int fd; int initport(int fd) { struct termios options; // Get the current options for the port... tcgetattr(fd, &options); // Set the baud rates to 19200... cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); // Enable the receiver and set local mode... options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; // Set the new options for the port... tcsetattr(fd, TCSANOW, &options); return 1; } int main(int argc, char **argv) { fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("open_port: Unable to open /dev/ttyS0 - "); return 1; } else { fcntl(fd, F_SETFL, 0); } printf("baud=%d\n", getbaud(fd)); initport(fd); printf("baud=%d\n", getbaud(fd)); char sCmd[254]; sCmd[0] = 0x41; sCmd[1] = 0x42; sCmd[2] = 0x43; sCmd[3] = 0x00; if (!writeport(fd, sCmd)) { printf("write failed\n"); close(fd); return 1; } printf("written:%s\n", sCmd); usleep(500000); char sResult[254]; fcntl(fd, F_SETFL, FNDELAY); // don't block serial read if (!readport(fd,sResult)) { printf("read failed\n"); close(fd); return 1; } printf("readport=%s\n", sResult); close(fd); return 0; } captain/capser.c /* capser.c (C) 2004-5 Captain http://www.captain.at Helper functions for "ser" Used for testing the PIC-MMC test-board http://www.captain.at/electronic-index.php */ #include /* Standard input/output definitions */ #include /* String function definitions */ #include /* UNIX standard function definitions */ #include /* File control definitions */ #include /* Error number definitions */ #include /* POSIX terminal control definitions */ int writeport(int fd, char *chars) { int len = strlen(chars); chars[len] = 0x0d; // stick a after the command chars[len+1] = 0x00; // terminate the string properly int n = write(fd, chars, strlen(chars)); if (n < 0) { fputs("write failed!\n", stderr); return 0; } return 1; } int readport(int fd, char *result) { int iIn = read(fd, result, 254); result[iIn-1] = 0x00; if (iIn < 0) { if (errno == EAGAIN) { printf("SERIAL EAGAIN ERROR\n"); return 0; } else { printf("SERIAL read error %d %s\n", errno, strerror(errno)); return 0; } } return 1; } int getbaud(int fd) { struct termios termAttr; int inputSpeed = -1; speed_t baudRate; tcgetattr(fd, &termAttr); /* Get the input speed. */ baudRate = cfgetispeed(&termAttr); switch (baudRate) { case B0: inputSpeed = 0; break; case B50: inputSpeed = 50; break; case B110: inputSpeed = 110; break; case B134: inputSpeed = 134; break; case B150: inputSpeed = 150; break; case B200: inputSpeed = 200; break; case B300: inputSpeed = 300; break; case B600: inputSpeed = 600; break; case B1200: inputSpeed = 1200; break; case B1800: inputSpeed = 1800; break; case B2400: inputSpeed = 2400; break; case B4800: inputSpeed = 4800; break; case B9600: inputSpeed = 9600; break; case B19200: inputSpeed = 19200; break; case B38400: inputSpeed = 38400; break; } return inputSpeed; } captain/capser.h int writeport(int fd, char *chars); int readport(int fd, char *result); int getbaud(int fd); -------------------------------------------------------------------------