OK. I got rid of the error by changing the struct to:
@ctypedef tcflag_t Cint
@ctypedef cc_t Cuchar
@ctypedef speed_t Cuint
mutable struct termios
c_iflag::tcflag_t #input flags
c_oflag::tcflag_t #output flags
c_cflag::tcflag_t #control flags
c_lflag::tcflag_t #local flags
c_line::cc_t #line discipline
c_cc::NTuple{NCCS,cc_t} #control chars
c_ispeed::speed_t #input speed
c_ospeed::speed_t #output speed
end
But, I still don’t seem to be getting any values for the input/output speeds.
julia> serialport = "/dev/ttyACM0"
"/dev/ttyACM0"
julia> baud = 9600
9600
julia> toptions = termios(0,0,0,0, 0, (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), 0, 0)
termios(0, 0, 0, 0, 0x00, (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), 0x00000000, 0x00000000)
julia> #fd = open(serialport, O_RDWR | O_NONBLOCK );
fd = ccall(:open, Cint, (Cstring, Cint), serialport, O_RDWR | O_NONBLOCK)
18
julia> if (fd == -1)
println("serialport_init: Unable to open port ")
return -1
end
julia> #int iflags = TIOCM_DTR;
#ioctl(fd, TIOCMBIS, &iflags); // turn on DTR
#ioctl(fd, TIOCMBIC, &iflags); // turn off DTR
dbg(1, toptions)
=== 1
tty.c_iflag: 0
tty.c_oflag: 0
tty.c_cflag: 0
tty.c_lflag: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_ispeed: 0
tty.c_ospeed: 0
julia> ret = ccall(:tcgetattr, Cint, (Cint, Ref{termios}), fd, toptions)
0
julia> if (ret < 0)
println("serialport_init: Couldn't get term attributes")
return -1
end
julia> dbg(2, toptions)
=== 2
tty.c_iflag: 0
tty.c_oflag: 0
tty.c_cflag: 4095
tty.c_lflag: 128
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_ispeed: 0
tty.c_ospeed: 0
julia> brate = baud; # let you override switch below if needed
julia> if (baud == 4800)
brate=B4800
elseif (baud == 9600)
brate=B9600
elseif (baud == 14400)
brate=B14400
elseif (baud == 19200)
brate=B19200
elseif (baud == 28800)
brate=B28800
elseif (baud == 38400)
brate=B38400
elseif (baud == 57600)
brate=B57600
elseif (baud == 115200)
brate=B115200
end
15
julia> #cfsetispeed(&toptions, brate);
#cfsetospeed(&toptions, brate);
ccall(:cfsetospeed, Void, (Ref{termios}, Cint), toptions, brate)
julia> ccall(:cfsetispeed, Void, (Ref{termios}, Cint), toptions, brate)
julia> dbg(3, toptions)
=== 3
tty.c_iflag: 0
tty.c_oflag: 0
tty.c_cflag: 4095
tty.c_lflag: 128
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_ispeed: 0
tty.c_ospeed: 0
julia> # 8N1
toptions.c_cflag &= ~PARENB
3695
julia> toptions.c_cflag &= ~CSTOPB
3595
julia> toptions.c_cflag &= ~CSIZE
3587
julia> toptions.c_cflag |= CS8
3647
julia> # no flow control
toptions.c_cflag &= ~CRTSCTS
1599
julia> #toptions.c_cflag &= ~HUPCL; // disable hang-up-on-close to avoid reset
toptions.c_cflag |= CREAD | CLOCAL # turn on READ & ignore ctrl lines
4095
julia> toptions.c_iflag &= ~(IXON | IXOFF | IXANY) # turn off s/w flow ctrl
0
julia> toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) # make raw
128
julia> toptions.c_oflag &= ~OPOST # make raw
0
julia> # see: http://unixwiz.net/techtips/termios-vmin-vtime.html
#toptions.c_cc[VMIN] = 0;
#toptions.c_cc[VTIME] = 0;
#toptions.c_cc[VTIME] = 20;
temp = string(VMIN) * "," * "0"
"6,0"
julia> temp = temp * "," * string(VTIME) * "," * "0"
"6,0,5,0"
julia> toptions.c_cc = initialize_NTuple(temp, NCCS)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
julia> dbg(4, toptions)
=== 4
tty.c_iflag: 0
tty.c_oflag: 0
tty.c_cflag: 4095
tty.c_lflag: 128
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_ispeed: 0
tty.c_ospeed: 0
julia> #tcsetattr(fd, TCSANOW, &toptions);
ret = ccall(:tcsetattr, Cint, (Cint, Cint, Ref{termios}), fd, TCSANOW, toptions)
0
julia> dbg(5, toptions)
=== 5
tty.c_iflag: 0
tty.c_oflag: 0
tty.c_cflag: 4095
tty.c_lflag: 128
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_ispeed: 0
tty.c_ospeed: 0
julia> ret = ccall(:tcsetattr, Cint, (Cint, Cint, Ref{termios}), fd, TCSAFLUSH, toptions)
0
julia> dbg(6, toptions)
=== 6
tty.c_iflag: 0
tty.c_oflag: 0
tty.c_cflag: 4095
tty.c_lflag: 128
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_cc[n]: 0
tty.c_ispeed: 0
tty.c_ospeed: 0
julia> if(ret < 0)
println("init_serialport: Couldn't set term attributes")
return -1
end
And, the values don’t match the C code values (still):
tty.c_iflag: 0
tty.c_oflag: 4
tty.c_cflag: 3261
tty.c_lflag: 0
tty.c_cc[0]: 0
tty.c_cc[1]: 0
tty.c_cc[2]: 0
tty.c_cc[3]: 0
tty.c_cc[4]: 0
tty.c_cc[5]: 0
tty.c_cc[6]: 0
tty.c_cc[7]: 0
tty.c_cc[8]: 0
tty.c_cc[9]: 0
tty.c_cc[10]: 0
tty.c_cc[11]: 0
tty.c_cc[12]: 0
tty.c_cc[13]: 0
tty.c_cc[14]: 0
tty.c_cc[15]: 0
tty.c_cc[16]: 0
tty.c_cc[17]: 0
tty.c_cc[18]: 0
tty.c_cc[19]: 0
tty.c_cc[20]: 0
tty.c_cc[21]: 0
tty.c_cc[22]: 0
tty.c_cc[23]: 0
tty.c_cc[24]: 0
tty.c_cc[25]: 0
tty.c_cc[26]: 0
tty.c_cc[27]: 0
tty.c_cc[28]: 0
tty.c_cc[29]: 0
tty.c_cc[30]: 0
tty.c_cc[31]: 0
tty.c_ispeed: 13
tty.c_ospeed: 13
Very frustrating!!