[Elecraft] K3 programming problem
Andrew Siegel
n2cn at siegel.org
Sun Jan 29 16:58:23 EST 2012
Neoklis,
I can't speak definitively on the differences between the Yaesu and the
K3 serial behavior, but I can speak with knowledge on serial I/O in Linux.
The read() system call "attempts to read" the number of bytes you asked
for. This means that when you call it, it will immediately return
whatever is already in the input buffer, up to "count" characters. If
there is nothing in the input buffer, it will either wait for a
character or return immediately, depending on thresholds set with the
tcsetattr() call. The number of characters that it read is returned as
the function value.
So if you call read(serial_fd, buffer, 14), you are not guaranteed to
read 14 characters. The only guarantee is that you won't read *more
than* 14 characters.
So there is some difference in the behavior of the Yaesu and the K3, but
both behaviors are normal. You just need to keep reading until you have
all the bytes you want. I wrote a function to do this:
/* read n characters from fd, guaranteed */
readn(fd,buf,n)
int fd;
char *buf;
int n;
{
int nchars, ret;
for (nchars = 0; nchars < n; nchars += ret) {
ret = read(fd,buf,n-nchars);
if (ret == -1 || ret == 0)
return(ret);
buf += ret;
}
return(n);
}
You may also want to look at the ioctl(fd,FIONREAD,&n) call. This tells
you how many bytes are pending to be read on the specified file descriptor.
Good luck!
73,
Andy, N2CN
Neoklis Kyriazis wrote:
> Hi
>
> I have started adding support for the K3 in my ham radio applications for Linux.
> I am currently working with my xdemorse app which decodes Morse code via
> the sound card and can also control the transceiver (tune in a signal on the
>
> waterfall exactly by changing the frequency of the receiver).
>
> Doing this involves reading the current VFO frequency, correcting it according
> to the offset from the center of the waterfall and then sending it to the K3 VFO.
> I have gotten all this to work well (I can tune in a CW signal to the nearest 1-2 Hz
> just by clicking near the trace!), but in order to read data from the K3 it was
>
> necessary to invoke the posix read() command to pull data from the K3 one byte
> at a time, e.g. read( serial_fd, buffer, 1 ) enough times to read all the data (14
> times to read the frequency with the FA; command!).
>
> Normally it should have been read( serial_fd, buffer, 14 ) to read all bytes, as it
> is done for the FT847/FT857 CAT. I would like to know if the above is the normal
> way to read the serial port of the K3 (e.g. one byte at a time), or if I am doing
> something wrong here.
>
> My thanks in advance.
>
>
>
> Regards Neoklis - Ham Radio Call 5B4AZ
> QTH Locator KM64KR
> Website: http://www.qsl.net/5b4az/
> ______________________________________________________________
> Elecraft mailing list
> Home: http://mailman.qth.net/mailman/listinfo/elecraft
> Help: http://mailman.qth.net/mmfaq.htm
> Post: mailto:Elecraft at mailman.qth.net
>
> This list hosted by: http://www.qsl.net
> Please help support this email list: http://www.qsl.net/donate.html
>
More information about the Elecraft
mailing list