Thread overview
communicating with a com port
Jun 01, 2005
Miguel F. Simoes
Jun 01, 2005
Regan Heath
Jun 01, 2005
Regan Heath
Jun 01, 2005
Brad Beveridge
Jun 01, 2005
Miguel F. Simoes
Jun 01, 2005
Tom S
Jun 01, 2005
Regan Heath
Jun 01, 2005
Miguel F. Simoes
June 01, 2005
I have been working on a project that will use language D to create the
graphical user interface.
The application needs to communicate with a Microchip Picdem Z Board.
The board can be accessed by COM4. How can I communicate with COM4 using D?

I have noticed that Phobos has some functions that can be related with this:
    ubyte inp(uint port_address)
    ushort inpw(uint port_address)
    uint inpl(uint port_address)

    ubyte outp(uint port_address, ubyte value)
    ushort outpw(uint port_address, ushort value)
    uint outpl(uint port_address, uint value)

How should I use them?

Greetings,
Miguel Ferreira Simoes


June 01, 2005
On Wed, 1 Jun 2005 21:47:40 +0100, Miguel F. Simoes <Kobold@netcabo.pt> wrote:
> I have been working on a project that will use language D to create the
> graphical user interface.
> The application needs to communicate with a Microchip Picdem Z Board.
> The board can be accessed by COM4. How can I communicate with COM4 using D?

Same way you'd do it in C. AFAIK there is no D library for this yet.

[On windows]---
CreateFile - to open port
GetCommTimeouts - to get timeouts
SetCommTimeouts - to set timeouts
GetCommState - to get state/mode
SetCommState - to set state/mode
CloseHandle - to close port
WaitCommEvent - to wait for input/output/etc
ReadFile - to read from port
WriteFile - to write to port
---

[On unix]---
open - to open port
tcgetattr - to get state/mode
tcsetattr - to set state/mode
close - to close port
select - to wait for input/output
read - to read from port
write - to write to port
---

[on FreeBSD/OS-X]---
cfsetispeed - to set input baud
cfsetospeed - to set output baud
---

> I have noticed that Phobos has some functions that can be related with this:
>     ubyte inp(uint port_address)
>     ushort inpw(uint port_address)
>     uint inpl(uint port_address)
>
>     ubyte outp(uint port_address, ubyte value)
>     ushort outpw(uint port_address, ushort value)
>     uint outpl(uint port_address, uint value)
>
> How should I use them?

I'm not sure what there do :)

Regan
June 01, 2005
On Thu, 02 Jun 2005 09:16:29 +1200, Regan Heath <regan@netwin.co.nz> wrote:
> On Wed, 1 Jun 2005 21:47:40 +0100, Miguel F. Simoes <Kobold@netcabo.pt> wrote:
>> I have been working on a project that will use language D to create the
>> graphical user interface.
>> The application needs to communicate with a Microchip Picdem Z Board.
>> The board can be accessed by COM4. How can I communicate with COM4 using D?
>
> Same way you'd do it in C. AFAIK there is no D library for this yet.
>
> [On windows]---
> CreateFile - to open port
> GetCommTimeouts - to get timeouts
> SetCommTimeouts - to set timeouts
> GetCommState - to get state/mode
> SetCommState - to set state/mode
> CloseHandle - to close port
> WaitCommEvent - to wait for input/output/etc
> ReadFile - to read from port
> WriteFile - to write to port
> ---
>
> [On unix]---
> open - to open port
> tcgetattr - to get state/mode
> tcsetattr - to set state/mode
> close - to close port
> select - to wait for input/output
> read - to read from port
> write - to write to port
> ---
>
> [on FreeBSD/OS-X]---
> cfsetispeed - to set input baud
> cfsetospeed - to set output baud
> ---
>
>> I have noticed that Phobos has some functions that can be related with this:
>>     ubyte inp(uint port_address)
>>     ushort inpw(uint port_address)
>>     uint inpl(uint port_address)
>>
>>     ubyte outp(uint port_address, ubyte value)
>>     ushort outpw(uint port_address, ushort value)
>>     uint outpl(uint port_address, uint value)
>>
>> How should I use them?
>
> I'm not sure what there do :)

EDIT: 'there' == 'these', or should I say 'there' is 'these' ;)
June 01, 2005
Thanks a lot.
It is my first time communicating with a com port.

Miguel


June 01, 2005
Miguel F. Simoes wrote:
> I have been working on a project that will use language D to create the
> graphical user interface.
> The application needs to communicate with a Microchip Picdem Z Board.
> The board can be accessed by COM4. How can I communicate with COM4 using D?

In the dark C++ days I used to have a *little* COM library working on Linux... Attaching its sources here, maybe you'll find some use for them :)



-- 
Tomasz Stachowiak  /+ a.k.a. h3r3tic +/


June 01, 2005
Regan Heath wrote:
> On Thu, 02 Jun 2005 09:16:29 +1200, Regan Heath <regan@netwin.co.nz> wrote:
> 
>> On Wed, 1 Jun 2005 21:47:40 +0100, Miguel F. Simoes <Kobold@netcabo.pt>  wrote:
>>
>>> I have been working on a project that will use language D to create the
>>> graphical user interface.
>>> The application needs to communicate with a Microchip Picdem Z Board.
>>> The board can be accessed by COM4. How can I communicate with COM4  using D?
>>
>>
>> Same way you'd do it in C. AFAIK there is no D library for this yet.
>>
>> [On windows]---
>> CreateFile - to open port
>> GetCommTimeouts - to get timeouts
>> SetCommTimeouts - to set timeouts
>> GetCommState - to get state/mode
>> SetCommState - to set state/mode
>> CloseHandle - to close port
>> WaitCommEvent - to wait for input/output/etc
>> ReadFile - to read from port
>> WriteFile - to write to port
>> ---
>>
>> [On unix]---
>> open - to open port
>> tcgetattr - to get state/mode
>> tcsetattr - to set state/mode
>> close - to close port
>> select - to wait for input/output
>> read - to read from port
>> write - to write to port
>> ---
>>
>> [on FreeBSD/OS-X]---
>> cfsetispeed - to set input baud
>> cfsetospeed - to set output baud
>> ---
>>
>>> I have noticed that Phobos has some functions that can be related with  this:
>>>     ubyte inp(uint port_address)
>>>     ushort inpw(uint port_address)
>>>     uint inpl(uint port_address)
>>>
>>>     ubyte outp(uint port_address, ubyte value)
>>>     ushort outpw(uint port_address, ushort value)
>>>     uint outpl(uint port_address, uint value)
>>>
>>> How should I use them?
>>
>>
>> I'm not sure what there do :)
> 
> 
> EDIT: 'there' == 'these', or should I say 'there' is 'these' ;)
I think that inp/outp will probably map to similar C functions.  IIRC they are pretty much x86 specific & you could use them to access IO space on the mother board.  Ie, outb(0x37F) writes to the parallel port (I think - very hazy here)

Brad
June 01, 2005
On Wed, 01 Jun 2005 23:28:39 +0200, Tom S <h3r3tic@remove.mat.uni.torun.pl> wrote:
> Miguel F. Simoes wrote:
>> I have been working on a project that will use language D to create the
>> graphical user interface.
>> The application needs to communicate with a Microchip Picdem Z Board.
>> The board can be accessed by COM4. How can I communicate with COM4 using D?
>
> In the dark C++ days I used to have a *little* COM library working on
> Linux... Attaching its sources here, maybe you'll find some use for them :)

Cool. I'm not 100% certain, but I believe on FreeBSD and OSX you get trouble with this line:

        options.c_cflag = CBAUD | B9600 | CS8 | CREAD | CLOCAL;

as it does not expect the baud there (IIRC it's a number not a flag on freeBSD), instead you must use

        cfsetispeed(&options, B9600);
        cfsetospeed(&options, B9600);

only. Of course, linux is fine with it either way.

Regan
June 01, 2005
Very cool.
I will have a depper look at it.

Thanks!

"Tom S" <h3r3tic@remove.mat.uni.torun.pl> escreveu na mensagem news:d7l9a8$2j1g$1@digitaldaemon.com...
> Miguel F. Simoes wrote:
>> I have been working on a project that will use language D to create the
>> graphical user interface.
>> The application needs to communicate with a Microchip Picdem Z Board.
>> The board can be accessed by COM4. How can I communicate with COM4 using
>> D?
>
> In the dark C++ days I used to have a *little* COM library working on Linux... Attaching its sources here, maybe you'll find some use for them :)
>
>
>
> -- 
> Tomasz Stachowiak  /+ a.k.a. h3r3tic +/
>


--------------------------------------------------------------------------------


> typedef unsigned char byte;
>
>
> class Comm
> {
> public:
>    enum CommStatus {
>        COMM_ERR  = 0,
>        COMM_OK   = 1,
>        COMM_NULL = 2
>    };
>
>    int fd;
>
>    CommStatus open();
>    CommStatus send(const byte *const data, const unsigned len);
>    CommStatus recvbyte(byte *const data);
>    CommStatus recv(byte* data, int size);
>
>     Comm() : fd(-1) {}
>    ~Comm() { if (fd != -1) close(fd); fd = -1; }
> };
>


--------------------------------------------------------------------------------


> #include <cstdlib>
>
> #include <cstdio>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <termios.h>
>
> #include "rs232.h"
>
>
> typedef unsigned char byte;
>
>    Comm::CommStatus Comm::open()
>    {
>        fd = ::open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
>        if (-1 == fd) return COMM_ERR;
>
>        struct termios options;
>        tcgetattr(fd, &options);
>
>        tcflush(fd, TCIFLUSH);
>        options.c_cflag = CBAUD | B9600 | CS8 | CREAD | CLOCAL;
>        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
>        options.c_iflag &= ~(INPCK | ISTRIP);
>        options.c_iflag &= ~(IXON | IXOFF | IXANY);
>        options.c_oflag &= ~OPOST;
>
>        cfsetispeed(&options, B9600);
>        cfsetospeed(&options, B9600);
>
>        tcsetattr(fd, TCSANOW, &options);
>
>        return COMM_OK;
>    }
>
>    Comm::CommStatus Comm::send(const byte *const data, const unsigned len)
>    {
>        int status = ::write(fd, data, len);
>
>        if (status < 0) return COMM_ERR;
>        else return COMM_OK;
>    }
>
>    Comm::CommStatus Comm::recvbyte(byte *const data)
>    {
>        int status = ::read(fd, data, 1);
>
>        if (status < 0 && errno == EAGAIN) return COMM_NULL;
>        else if(status < 0) return COMM_ERR;
>        return COMM_OK;
>    }
>
>    Comm::CommStatus Comm::recv(byte* data, int size)
>    {
>        CommStatus st = recvbyte(data);
>        if (st != COMM_OK) return st;
>        if (1 == size--)   return st;
>
>        fcntl(fd, F_SETFL, 0);
>
>        while (size-- > 0)
>        {
>            st = recvbyte(++data);
>            if (st != COMM_OK) break;
>        }
>
>        fcntl(fd, F_SETFL, FNDELAY);
>        return st;
>    }
>