#include <libserialport.h>
#include <stdio.h>
// Compile:
// gcc -o example example.c $(pkg-config --cflags --libs libserialport)
int main(int argc, char *argv[])
{
char *uri = argv[1];
struct sp_port *port;
if (sp_get_port_by_name(uri, &port) == SP_OK)
{
char *portname = sp_get_port_name(port);
char *portdesc = sp_get_port_description(port);
printf("Port name: %s\n", portname);
printf("Description: %s\n", portdesc);
}
else
printf("Could not find %s\n", uri);
return 0;
}
$ ./example /dev/cu.usbmodem1413
Port name: /dev/cu.usbmodem1413
Description: STM32 STLink
enum sp_return sp_get_port_by_name(const char *portname, struct sp_port **port_ptr);
julia> type Port end
julia> p = Ref{Port}()
Base.RefValue{Port}(#undef)
julia> ccall((:sp_get_port_by_name, "libserialport"),Cint,(AbstractString, Ref{Ref{Port}}),"/dev/cu.usbmodem1413",p)
0
julia> p
Base.RefValue{Port}(Segmentation fault: 11
or
immutable Port
portpointer::Ptr{Void}
end
p=Port(0)
ccall((:sp_get_port_by_name, "libserialport"),Cint,(AbstractString, Ref{Port}),"/dev/cu.usbmodem1413",p)
julia> p = Ptr{Int}[0]
1-element Array{Ptr{Int64},1}:
Ptr{Int64} @0x0000000000000000
julia> ccall((:sp_get_port_by_name, "libserialport"),Cint,(AbstractString, Ref{Ptr{Int}}),"/dev/cu.usbmodem1413",p)
0
julia> p
1-element Array{Ptr{Int64},1}:
Ptr{Int64} @0x00007fb4d8614f70
julia> bytestring(ccall((:sp_get_port_name, "libserialport"), Ptr{Cchar}, (typeof(p),), p))
"pOaش\x7f"
julia> bytestring(ccall((:sp_get_port_name, "libserialport"), Ptr{Cchar}, (Ptr{Int},), p[]))
"\x10!}\b\x01"
julia> immutable Port
portpointer::Ptr{Void}
end
julia> p = Port(0)
Port(Ptr{Void} @0x0000000000000000)
julia> ccall((:sp_get_port_by_name, "libserialport"),Cint,(AbstractString, Ref{Port}),"/dev/cu.usbmodem1413",p)
0
julia> p
Port(Ptr{Void} @0x0000000000000000)
julia> p = Ref{Ptr{Void}}()
Base.RefValue{Ptr{Void}}(Ptr{Void} @0x0000000000000000)
julia> ccall((:sp_get_port_by_name, "libserialport"),Cint,(Cstring, Ref{Ptr{Void}}), "/dev/cu.usbmodem1413", p)
0
julia> bytestring(ccall((:sp_get_port_name, "libserialport"), Ptr{Cchar}, (Ptr{Void},), p[]))
"/dev/cu.usbmodem1413"
julia> bytestring(ccall((:sp_get_port_description, "libserialport"), Ptr{Cchar}, (Ptr{Void},), p[]))
"STM32 STLink"
enum sp_return sp_list_ports(struct sp_port ***list_ptr);
julia> ports = Ref{Ptr{Ptr{Void}}}()
julia> ccall((:sp_list_ports, "libserialport"), Cint, (Ref{Ptr{Ptr{Void}}},), ports)
julia> ports
Base.RefValue{Ptr{Ptr{Void}}}(Ptr{Ptr{Void}} @0x00007ffe8d8f2a00)
julia> a = pointer_to_array(ports[], (2,), true)
2-element Array{Ptr{Void},1}:
Ptr{Void} @0x00007ffe8d9617e0
Ptr{Void} @0x00007ffe8d989990
julia> bytestring(ccall((:sp_get_port_name, "libserialport"), Ptr{Cchar}, (Ptr{Void},), a[1]))
"/dev/cu.Bluetooth-Incoming-Port"
julia> bytestring(ccall((:sp_get_port_name, "libserialport"), Ptr{Cchar}, (Ptr{Void},), a[2]))
"/dev/cu.usbmodem1413"
I think the second one I'm suggesting needs to be
p=Ref{Port}() #looking Yuchiao comment.
I learn myself too, maybe I should look at docs again. Ref confuses me.