Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
June 01, 2005 communicating with a com port | ||||
---|---|---|---|---|
| ||||
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 Re: communicating with a com port | ||||
---|---|---|---|---|
| ||||
Posted in reply to Miguel F. Simoes | 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 Re: communicating with a com port | ||||
---|---|---|---|---|
| ||||
Posted in reply to Regan Heath | 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 Re: communicating with a com port | ||||
---|---|---|---|---|
| ||||
Posted in reply to Regan Heath | Thanks a lot. It is my first time communicating with a com port. Miguel |
June 01, 2005 Re: communicating with a com port | ||||
---|---|---|---|---|
| ||||
Posted in reply to Miguel F. Simoes | 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 Re: communicating with a com port | ||||
---|---|---|---|---|
| ||||
Posted in reply to Regan Heath | 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 Re: communicating with a com port | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tom S | 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 Re: communicating with a com port | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tom S | 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; > } > |
Copyright © 1999-2021 by the D Language Foundation