Initial revision

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.0.0
Frank Singleton, VK3FCS 2000-07-18 20:55:08 +00:00
rodzic 4bd5e22f9b
commit 9419ada73e
10 zmienionych plików z 973 dodań i 0 usunięć

39
README 100644
Wyświetl plik

@ -0,0 +1,39 @@
hamlib - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
The purpose of this project is to provide stable, flexible,
shared libraries that enable quicker development of Amateur
Radio Equipment Control Applications.
Many Amateur Radio Transceivers come with serial interfaces
that allows software to control the radio. This project will
endeavour to provide shared libraries that greatly simplify
the application programmers interaction with radio equipment.
The shared libs will provide functions for both radio control,
and data retrieval from the radio.
Examples are:
1.libft747.so will provide connectivity to Yeasu
FT 747GX Transceiver via a standard API.
2. libft847.so will provide connectivity to Yaesu FT 847
"Earth Station" via a standard API.
3. libxxxx.so will provide connectivity to the Wiz-bang
moon-melter 101A (yikes..)
These libraries will also enable developers to develop
professional looking GUI's towards a standard control library
API, and they would not have to worry about the underlying
connection towards physical hardware.
Initially serial (RS232) connectivity will be handled, but
I expect that IP connectivity will follow afterwards.
Have Fun / Frank S.
73's de vk3fcs/km5ws

15
TODO.skeleton 100644
Wyświetl plik

@ -0,0 +1,15 @@
hamlib - (C) Frank Singleton 2000
TODO.<your rig> - (C) <your name> 2000
This shared library provides an API for communicating
via serial interface to a <your rig> using the <your interface> interface.
TODO
----
1. Complete pcodes
2. Write More extensive Test Suite
3. Document API
4. Document Limitations/Assumptions.
5.

85
ft747/Makefile 100644
Wyświetl plik

@ -0,0 +1,85 @@
#
#
# Make file for FT-747GX CAT program shared lib
#
# creates: libft747.so
#
# $Id: Makefile,v 1.1 2000-07-18 20:53:46 frank Exp $
#
#
# .h files go in INSTALL_INCLUDEDIR
# .so files go in INSTALL_LIBDIR
#
#
INSTALL_LIBDIR = ./lib/
INSTALL_INCLUDEDIR = ./include/
LIB_NAME = libft747.so
LIB_SONAME = libft747.so.1
LIB_RELEASE = libft747.so.1.0.1
LIB_HEADER = ft747.h
LIB_SRC = ft747.c
LIB_OBJECTS = ft747.o
all: lib
.PHONY: lib
lib:
gcc -fPIC -g -Wall -c $(LIB_SRC)
gcc -shared -Wl,-soname,$(LIB_SONAME) -o $(LIB_RELEASE) $(LIB_OBJECTS) -lc
# install header and lib
install:
make install_lib
make install_header
# install lib in MYLIBDIR
.PHONY: install_lib
install_lib:
mv $(LIB_RELEASE) $(INSTALL_LIBDIR)
cd $(INSTALL_LIBDIR); /sbin/ldconfig -n .
cd $(INSTALL_LIBDIR); ln -s $(LIB_SONAME) $(LIB_NAME)
# install libft747.h in INSTALL_INCLUDEDIR
.PHONY: install_header
install_header:
cp -f $(LIB_HEADER) $(INSTALL_INCLUDEDIR)
# clean up local directory, my include and lib
# directories also.
clean:
make cleanlocal
make cleanlib
make cleaninclude
# clean up local directory
.PHONY: cleanlocal
cleanlocal:
rm -f *.o *.so*
# clean up local lib directory
.PHONY: cleanlib
cleanlib:
cd $(INSTALL_LIBDIR); rm -f $(LIB_NAME)*
# clean up local include directory
.PHONY: cleaninclude
cleaninclude:
cd $(INSTALL_INCLUDEDIR); rm -f $(LIB_HEADER)

34
ft747/README.ft747 100644
Wyświetl plik

@ -0,0 +1,34 @@
hamlib - (C) Frank Singleton 2000
libft747.so - (C) Frank Singleton 2000
This shared library provides an API for communicating
via serial interface to an FT-747GX using the "CAT" interface
box (FIF-232C) or similar.
Reference Documentation
-----------------------
Operating Manual
FT-747GX
Yaesu Musen Co, LTD.
Status
------
Handles >90% of all opcodes
Warnings
--------
NA
Contributors
------------

16
ft747/TODO.ft747 100644
Wyświetl plik

@ -0,0 +1,16 @@
hamlib - (C) Frank Singleton 2000
TODO.ft747 - (C) Frank Singleton 2000
This shared library provides an API for communicating
via serial interface to an FT-747GX using the "CAT" interface
box (FIF-232C) or similar.
TODO
----
1. Complete pcodes
2. Write More extensive Test Suite
3.
4.
5.

346
ft747/ft747.c 100644
Wyświetl plik

@ -0,0 +1,346 @@
/*
* hamlib - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
*
* ft747.c - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
* This shared library provides an API for communicating
* via serial interface to an FT-747GX using the "CAT" interface
* box (FIF-232C) or similar
*
*
* $Id: ft747.c,v 1.1 2000-07-18 20:54:22 frank Exp $
*
*/
#include <stdlib.h>
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <sys/ioctl.h>
#include "ft747.h"
static unsigned char datain[350]; /* data read from rig */
struct ft747_update_data {
unsigned char displayed_status;
unsigned char displayed_freq[5];
unsigned char current_band_data;
unsigned char vfo_a_status;
unsigned char vfo_a_freq_block[5];
};
/*
* Function definitions below
*/
/*
* Provides delay for block formation.
* Should be 50-200 msec according to YAESU docs.
*/
static void pause2() {
usleep(50 * 1000); /* 50 msec */
return;
}
/*
* Write a 5 character block to a file descriptor,
* with a pause between each character.
*
* input:
*
* fd - file descriptor to write to
* data - pointer to a command sequence array
*
* returns:
*
* 0 = OK
* -1 = NOT OK
*
*/
static int write_block(int fd, unsigned char *data) {
int i;
for (i=0; i<5; i++) {
if(write(fd, &data[i] , 1) < 0) {
fputs("write() of byte failed!\n", stderr);
return -1;
}
pause2(); /* 50 msec */
}
return 0;
}
/*
* Open serial port
*
* Set to 4800 8N2
*
* input:
*
* serial_port - ptr to a char (string) indicating port
* to open (eg: "/dev/ttyS1").
*
* returns:
*
* fd - the file descriptor on success or -1 on error.
*
*/
int open_port(char *serial_port) {
int fd; /* File descriptor for the port */
struct termios options;
fd = open(serial_port, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
/* Could not open the port. */
printf("open_port: Unable to open %s - ",serial_port);
return -1; /* bad */
}
fcntl(fd, F_SETFL, 0); /* */
/*
* Get the current options for the port...
*/
tcgetattr(fd, &options);
/*
* Set the baud rates to 4800...
*/
cfsetispeed(&options, B4800);
cfsetospeed(&options, B4800);
/*
* Enable the receiver and set local mode...
*/
options.c_cflag |= (CLOCAL | CREAD);
/*
* Set 8N2
*/
options.c_cflag &= ~PARENB;
options.c_cflag |= CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
/*
* Chose raw input, no preprocessing please ..
*/
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/*
* Chose raw output, no preprocessing please ..
*/
options.c_oflag &= ~OPOST;
/*
* Set the new options for the port...
*/
tcsetattr(fd, TCSANOW, &options);
return (fd);
}
/*
* 'close_port()' - Close serial port
*
* fd - file descriptor for open port
*
*
* Returns success (0) or -1 on error.
*/
int close_port(int fd) {
if (close(fd) <0 ) {
printf("close_port: Unable to close port using fd %i - ",fd);
return -1; /* oops */
}
return 0; /* ok */
}
/*
* Implement OPCODES
*/
void cmd_split_yes(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x01, 0x01 }; /* split = on */
write_block(fd,data);
}
void cmd_split_no(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x01 }; /* split = off */
write_block(fd,data);
}
void cmd_recall_memory(int fd, int mem) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x02 }; /* recall memory*/
data[3] = mem;
write_block(fd,data);
}
void cmd_vfo_to_memory(int fd, int mem) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x03 }; /* vfo to memory*/
data[3] = mem;
write_block(fd,data);
}
void cmd_dlock_off(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x04 }; /* dial lock = off */
write_block(fd,data);
}
void cmd_dlock_on(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x01, 0x04 }; /* dial lock = on */
write_block(fd,data);
}
void cmd_select_vfo_a(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x05 }; /* select vfo A */
write_block(fd,data);
}
void cmd_select_vfo_b(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x01, 0x05 }; /* select vfo B */
write_block(fd,data);
}
void cmd_memory_to_vfo(int fd, int mem) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x06 }; /* memory to vfo*/
data[3] = mem;
write_block(fd,data);
}
void cmd_up500k(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x07 }; /* up 500 khz */
write_block(fd,data);
}
void cmd_down500k(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x08 }; /* down 500 khz */
write_block(fd,data);
}
void cmd_clarify_off(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x09 }; /* clarify off */
write_block(fd,data);
printf("cmd_clarify_off complete \n");
}
void cmd_clarify_on(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x01, 0x09 }; /* clarify on */
write_block(fd,data);
printf("cmd_clarify_on complete \n");
}
void cmd_freq_set(int fd, unsigned int freq) {
printf("cmd_freq_set not implemented yet \n");
}
void cmd_mode_set(int fd, int mode) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x0c }; /* mode set */
data[3] = mode;
write_block(fd,data);
printf("cmd_mode_set complete \n");
}
void cmd_pacing_set(int fd, int delay) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x0e }; /* pacing set */
data[3] = delay;
write_block(fd,data);
printf("cmd_pacing_set complete \n");
}
void cmd_ptt_off(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x0f }; /* ptt off */
write_block(fd,data);
printf("cmd_ptt_off complete \n");
}
void cmd_ptt_on(int fd) {
#ifndef TX_DISABLED
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x01, 0x0f }; /* ptt on */
write_block(fd,data);
printf("cmd_ptt_on complete \n");
#elsif
printf("cmd_ptt_on disabled \n");
#endif
}
void cmd_update(int fd) {
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; /* request update from rig */
write_block(fd,data);
printf("cmd_update complete \n");
}
/*
* Read data from rig and store in buffer provided
* by the user.
*/
void cmd_update_store(int fd, unsigned char *buffer) {
int bytes; /* read from rig */
int i,n; /* counters */
static unsigned char data[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; /* request update from rig */
write_block(fd,data);
/*
* Sleep regularly until the buffer contains all 345 bytes
* This should handle most values used for pacing.
*/
bytes = 0;
while(bytes < 345) {
ioctl(fd, FIONREAD, &bytes); /* get bytes in buffer */
printf("bytes = %i\n", bytes);
sleep(1); /* wait 1 second */
}
/* this should not block now */
n = read(fd,datain,345); /* grab 345 bytes from rig */
for(i=0; i<n; i++) {
printf("i = %i ,datain[i] = %x \n", i, datain[i]);
}
printf("cmd_update complete \n");
return;
}

99
ft747/ft747.h 100644
Wyświetl plik

@ -0,0 +1,99 @@
/*
* hamlib - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
*
* ft747.h - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
* This shared library provides an API for communicating
* via serial interface to an FT-747GX using the "CAT" interface
* box (FIF-232C) or similar
*
*
* $Id: ft747.h,v 1.1 2000-07-18 20:54:28 frank Exp $
*/
/*
* Allow TX commands to be disabled
*
*/
#define TX_DISABLED
/* MODES - when setting modes via cmd_mode_set() */
const int MODE_SET_LSB = 0x00;
const int MODE_SET_USB = 0x01;
const int MODE_SET_CWW = 0x02;
const int MODE_SET_CWN = 0x03;
const int MODE_SET_AMW = 0x04;
const int MODE_SET_AMN = 0x05;
const int MODE_SET_FMW = 0x06;
const int MODE_SET_FMN = 0x07;
/*
* Status Flags
*/
const int SF_DLOCK = (1<<0);
const int SF_SPLIT = (1<<1);
const int SF_CLAR = (1<<2);
const int SF_VFOAB = (1<<3);
const int SF_VFOMR = (1<<4);
const int SF_RXTX = (1<<5);
const int SF_RESV = (1<<6);
const int SF_PRI = (1<<7);
/*
* Mode Bitmap. Bits 5 and 6 unused
* When reading modes
*/
const int MODE_FM = (1<<0);
const int MODE_AM = (1<<1);
const int MODE_CW = (1<<2);
const int MODE_USB = (1<<3);
const int MODE_LSB = (1<<4);
const int MODE_NAR = (1<<7);
/*
* Map band data value to band.
*
* Band "n" is from band_data[n] to band_data[n+1]
*/
const float band_data[11] = { 0.0, 0.1, 2.5, 4.0, 7.5, 10.5, 14.5, 18.5, 21.5, 25.0, 30.0 };
/*
* Visible functions in shared lib.
*
*/
int open_port(char *serial_port); /* return fd or -1 on error */
int close_port(int fd); /* close port using fd */
void cmd_split_yes(int fd);
void cmd_split_no(int fd);
void cmd_recall_memory(int fd, int mem);
void cmd_vfo_to_memory(int fd, int mem);
void cmd_dlock_off(int fd);
void cmd_dlock_on(int fd);
void cmd_select_vfo_a(int fd);
void cmd_select_vfo_b(int fd);
void cmd_memory_to_vfo(int fd, int mem);
void cmd_up500k(int fd);
void cmd_down500k(int fd);
void cmd_clarify_off(int fd);
void cmd_clarify_on(int fd);
void cmd_freq_set(int fd, unsigned int freq);
void cmd_mode_set(int fd, int mode);
void cmd_pacing_set(int fd, int delay);
void cmd_ptt_off(int fd);
void cmd_ptt_on(int fd); /* careful.. */
void cmd_update(int fd); /* data internal */
void cmd_update_store(int fd, unsigned char *buffer); /* data external */

Wyświetl plik

@ -0,0 +1,62 @@
# hamlib - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
#
# testlibft747 - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
# This program uses libft747.so to test an API for communicating
# via serial interface to an FT-747GX using the "CAT" interface
# box (FIF-232C) or similar
#
#
# Make file for libft747.so shared lib test suite.
#
#
# $Id: Makefile,v 1.1 2000-07-18 20:54:50 frank Exp $
#
#
#
#
#TEST_LIBDIR = ../lib
#TEST_INCLUDEDIR = ../include
LIB_NAME = libft747.so
LIB_HEADER = ft747.h
#LIB_SONAME = libft747.so.1
#LIB_RELEASE = libft747.so.1.0.1
CC = gcc
INCLUDE = -I/usr/include -I/usr/local/include -I. -I../
OBJ = testlibft747.o
LDFLAG = -lm -lft747 -L../
CFLAGS = -g -Wall -ansi -pedantic -O2 -D__USE_FIXED_PROTOTYPES__
MAKEALL = testlibft747
all: $(MAKEALL)
testlibft747: $(OBJ)
$(CC) $(CFLAGS) $(INCLUDE) $(LDFLAG) -o testlibft747 $(OBJ)
testlibft747.o: testlibft747.c testlibft747.h
$(CC) $(CFLAGS) $(INCLUDE) -c testlibft747.c
# clean up
clean:
make cleanlocal
# clean up local directory
.PHONY: cleanlocal
cleanlocal:
rm -f *.o testlibft747
# run test program in local directory
.PHONY: runtest
runtest:
(LD_LIBRARY_PATH="../lib" ./testlibft747 )

Wyświetl plik

@ -0,0 +1,262 @@
/* hamlib - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
*
* testlibft747.c - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
* This program tests the libft747.so API for communicating
* via serial interface to an FT-747GX using the "CAT" interface
* box (FIF-232C) or similar.
*
*
* $Id: testlibft747.c,v 1.1 2000-07-18 20:55:01 frank Exp $
*
*/
#include <stdlib.h>
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <sys/ioctl.h>
#include "testlibft747.h"
#include "ft747.h"
static unsigned char datain[350]; /* data read from rig */
struct ft747_update_data {
unsigned char displayed_status;
unsigned char displayed_freq[5];
unsigned char current_band_data;
unsigned char vfo_a_status;
unsigned char vfo_a_freq_block[5];
};
/*
* Decode routines for status update map
*/
static void decode_status_flags(unsigned char flags) {
if((flags & SF_DLOCK) != 0 ) {
printf("Dial Lock = SET \n");
} else {
printf("Dial Lock = CLEAR \n");
}
if((flags & SF_SPLIT) != 0 ) {
printf("Split = SET \n");
} else {
printf("Split = CLEAR \n");
}
if((flags & SF_CLAR) != 0 ) {
printf("Clar = SET \n");
} else {
printf("Clar = CLEAR \n");
}
if((flags & SF_VFOAB) != 0 ) {
printf("VFO = B \n");
} else {
printf("VFO = A \n");
}
if((flags & SF_VFOMR) != 0 ) {
printf("VFO/MR = MR \n");
} else {
printf("VFO/MR = VFO \n");
}
if((flags & SF_RXTX) != 0 ) {
printf("RX/TX = TX \n");
} else {
printf("RX/TX = RX \n");
}
if((flags & SF_PRI) != 0 ) {
printf("Priority Monitoring = ON \n");
} else {
printf("Priority Monitoring = OFF \n");
}
}
/*
* Decode routines for status update map
*/
static void decode_mode_bit_map(unsigned char mbm) {
unsigned char mask = 0x1f;
unsigned char mode = mbm & mask; /* grab operating mode */
printf("mbm = %x, mode = %x \n",mbm, mode);
switch(mode) {
case 1:
printf("Current Mode = FM \n");
break;
case 2:
printf("Current Mode = AM \n");
break;
case 4:
printf("Current Mode = CW \n");
break;
case 8:
printf("Current Mode = USB \n");
break;
case 16:
printf("Current Mode = LSB \n");
break;
default:
printf("Current mode = XXXXX \n");
break;
}
if((mbm & MODE_NAR) != 0 ) {
printf("Narrow = SET \n");
} else {
printf("Narrow = CLEAR \n");
}
}
/*
* Decode routines for status update map
*/
static void decode_band_data(unsigned char data) {
unsigned char mask = 0x0f;
unsigned char bd = data & mask; /* grab band data */
printf("Band data is %f - %f \n", band_data[bd], band_data[bd+1]);
}
/*
* Do a hex dump of the unsigned car array.
*/
static void dump_hex(unsigned char *ptr, int size, int length) {
int i;
printf("Memory Dump \n\n");
for(i=0; i<size; i++) {
printf(" 0x%2.2x", *(ptr+i));
if (i % length == 15) {
printf("\n");
}
}
printf("\n\n");
}
/*
* Simple test to see if we are talking to the RIG.
*/
static int test(fd) {
int n,i;
int bytes = 0;
struct ft747_update_data *header;
cmd_split_yes(fd);
sleep(1);
cmd_split_no(fd);
sleep(1);
cmd_dlock_on(fd);
sleep(1);
/* cmd_dlock_off(fd); */
sleep(1);
cmd_select_vfo_a(fd);
sleep(1);
cmd_up500k(fd);
sleep(1);
cmd_down500k(fd);
sleep(1);
/* cmd_memory_to_vfo(fd,1); */
sleep(1);
/* cmd_vfo_to_memory(fd,2); */
sleep(1);
cmd_mode_set(fd,3); /* cw */
cmd_ptt_on(fd); /* stand back .. */
sleep(1);
cmd_ptt_off(fd); /* phew.. */
sleep(1);
cmd_pacing_set(fd,0); /* set pacing */
cmd_update(fd); /* request data from rig */
/* sleep(1); */ /* be nice .. */
/* n = read(fd,datain,345); */ /* grab 345 bytes from rig */
/* printf("n = %i, frequency = %.6s \n", n, datain[1]); */
/*
* Sleep regularly until the buffer contains all 345 bytes
* This should handle most values used for pacing.
*/
bytes = 0;
while(bytes < 345) {
ioctl(fd, FIONREAD, &bytes); /* get bytes in buffer */
printf("bytes = %i\n", bytes);
sleep(1);
}
/* this should not block now */
n = read(fd,datain,345); /* grab 345 bytes from rig */
for(i=0; i<n; i++) {
printf("i = %i ,datain[i] = %x \n", i, datain[i]);
}
header = (struct ft747_update_data *) &datain; /* overlay header onto datain */
printf("Frequency = %x.%x%x%x \n", header->displayed_freq[1],
header->displayed_freq[2],
header->displayed_freq[3],
header->displayed_freq[4]
);
decode_status_flags(datain[0]); /* decode flags */
printf("Displayed Memory = %i \n", datain[23]);
decode_mode_bit_map(datain[24]); /* decode mode bit map */
decode_band_data(datain[6]); /* decode current band data */
dump_hex(datain, 345, 16); /* do a hex dump */
return 0;
}
/*
* Main program starts here..
*/
int main(void) {
int fd;
fd = open_port(SERIAL_PORT);
printf("port opened ok \n");
test(fd);
printf("testing communication result ok \n");
close(fd);
printf("port closed ok \n");
return 0;
}

Wyświetl plik

@ -0,0 +1,15 @@
/*
* hamlib - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
*
* testlibft747.h - (C) Frank Singleton 2000 (vk3fcs@ix.netcom.com)
* This program tests the libft747.so API for communicating
* via serial interface to an FT-747GX using the "CAT" interface
* box (FIF-232C) or similar.
*
*
* $Id: testlibft747.h,v 1.1 2000-07-18 20:55:08 frank Exp $
*/
#define SERIAL_PORT "/dev/ttyS1"