Blijkbaar heb je een distro gebruikt waar build-essential al in zit. Dus gaan we daar van uit.
Om een airmar H2183 op 38400 baud in te stellen met een Rpi doe ik het volgende.
Je maakt een map aan op de Rpi.
Daarin zet je de volgende bestanden;
main.c
Inhoud aan text. Ik gebruik nano maar vi is ook prima. Geen Word of zo gebruiken we hebben platte text nodig.
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "airmarHS.h"
#include "airmarFunc.h"
/*
BEGIN VAN MAIN BEGIN VAN MAIN BEGIN VAN MAIN BEGIN VAN MAIN BEGIN VAN MAIN
*/
int main()
{
int fd_kompas;
fd_kompas = open_serieel( MODEMDEVICE_KOMPAS , BAUDRATE_KOMPAS ,1);
toonTTY(fd_kompas,6);
/* stel kompas in op 38400 baud */
initkompas(fd_kompas);
toonTTY(fd_kompas,6);
return 0;
}
airmarHS.h
inhoud
verander ttyUSB1 naar zoals het kompas door je Rpi herkend wordt.
/* tty */
/* IN en OUT van kompas */
#define BAUDRATE_KOMPAS B4800
#define BAUDRATE_HSKOMPAS B38400
#define MODEMDEVICE_KOMPAS "/dev/ttyUSB1”
airmarFunc.c
inhoud
Hier kun je veranderingen aanbrengen als je wilt dat het kompas andere data moet uitzenden o.i.d.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "airmarHS.h"
int open_serieel( char poort[],int snelheid , int cts)
{
struct termios oldtio,newtio;
int fd ;
fd = open( poort, O_RDWR | O_NOCTTY );
if (fd <0) {perror(poort); exit(-1); }
tcgetattr(fd,&oldtio); /* save current serial port settings */
bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
if (cts > 0)
/*newtio.c_cflag = snelheid | CRTSCTS | CS8 | CLOCAL | CREAD;*/
newtio.c_cflag = snelheid | CS8 | CLOCAL | CREAD;
else
newtio.c_cflag = snelheid | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR ;
newtio.c_oflag = OPOST ;
if (cts == 1) newtio.c_lflag = ICANON;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
return fd ;
}
int ComputeChecksum( char regel[],int lengte )
{
int checksum_value = 0;
int string_length = lengte;
int index = 1; /* Skip over the $ at the begining of the sentence*/
while( index < string_length && regel[ index ] != '*' )
{
checksum_value ^= regel[ index ];
index++;
}
regel[index] = '\0';
sprintf(regel ,"%s*%2X\n",regel,checksum_value);
index = index+5;
if (regel[index-4]==32){
regel[index-4]=48;
}
regel[index-2] = '\r';
regel[index-1] = '\n';
regel[index] = '\0';
return index;
}
void initkompas(int fd)
{
/* stel kompas in */
int l_buf,in,uit;
char buf[100];
strcpy(buf,"$PAMTX,0*");
l_buf = strlen(buf);
l_buf = ComputeChecksum( buf,l_buf );
uit = write(fd,buf,l_buf);
if (uit != l_buf) printf("error");
ioctl(fd,FIONREAD,&in);
while (in != 0){
l_buf = read(fd,buf,255);
ioctl(fd,FIONREAD,&in);
}
strcpy(buf,"$PAMTC,BAUD,38400*");
l_buf = strlen(buf);
l_buf = ComputeChecksum( buf,l_buf );
uit = write(fd,buf,l_buf);
close(fd);
/* wacht 5 sec */
sleep(10);
fd = open_serieel( MODEMDEVICE_KOMPAS , BAUDRATE_HSKOMPAS ,1);
/*
herhaal deze 4 regels voor de instellingen die je wilt doen
strcpy(buf,"$PAMTC,EN,HDG,,0:0.25*");
l_buf = strlen(buf);
l_buf = ComputeChecksum( buf,l_buf );
uit = write(fd,buf,l_buf);
*/
strcpy(buf,"$PAMTX,1*");
l_buf = strlen(buf);
l_buf = ComputeChecksum( buf,l_buf );
uit = write(fd,buf,l_buf);
return;
}
void toonTTY( int fd, int t)
{
fd_set readfds;
char buf[255];
int in=0,input=0,regels,l_buf;
for (regels=0;regels<t;++regels)
{
/* wacht op input */
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
in = select(sizeof(readfds)+1, &readfds, NULL, NULL, NULL);
in = FD_ISSET( fd , &readfds);
if ( in != 0) input = 1;
/* lees tty uit */
if(input == 1)
{
l_buf = read(fd,buf,255);
buf[l_buf]='\0';
printf("%s",buf);
}
}
return;
}
airmarFunc.h
inhoud
int open_serieel( char poort[],int snelheid ,int cts );
int ComputeChecksum( char regel[],int lengte );
void initkompas(int fd);
void toonTTY( int fd, int t);
Makefile
inhoud
PREFIX=/usr/local
CC = gcc
PROGNAME=airmarHS
CFLAGS = -O2 -Wall -pedantic
all: $(PROGNAME)
main.o: main.c airmarHS.h airmarFunc.h
$(CC) $(CFLAGS) -c -o main.o main.c
airmarFunc.o: airmarHS.h airmarFunc.c
$(CC) $(CFLAGS) -c -o airmarFunc.o airmarFunc.c
$(PROGNAME): main.o airmarFunc.o
$(CC) $(CFLAGS) -lm -o $(PROGNAME) main.o airmarFunc.o
install: $(PROGNAME)
install -d /bin
install -s -g root -o root -m 4755 $(PROGNAME) /bin
clean:
-rm -f *.o
-rm -f airmarHS
Als je deze map klaar hebt met de 5 bestanden er in begin je een terminal sessie en ga (cd) je na de betreffende map en voert het commando uit;
sudo make install
Dit hoeft als het goed is maar 1 keer. Of als je aan de code iets veranderd hebt.
Daarna heb je een nieuw commando aan de Rpi toegevoegd
airmarHS
Wat het kompas van 4800 naar 34800 baud omschakelt.
Natuurlijk kun je naar hartelust aan de code sleutelen. Bijvoorbeeld dat het niet meer een aantal ontvangen regels van het kompas toont wordt.