sending com port command

1,571 views
Skip to first unread message

Erin

unread,
Feb 17, 2012, 6:46:42 PM2/17/12
to E-Prime
I am trying to send a command to an external device via a usb
connection. The external device is an ADU200 USB Relay I/O Interface
(http://www.ontrak.net/ADUcommands.htm). This is a control box which
triggers an automatic feeder for our monkeys. Using the control box's
test software, I can trigger the auto feeder by sending the control
box the command "sk0." So, I know I need E-Prime to send the command
"sk0" to the ADU200 control box via a usb COM port.

I have read the E-Prime help, and it appears it is difficult to send a
non binary message via a com port (the WritePort command). It is
possible I may need to use something called a Declare Statement, which
is done outside of E-Prime. However, I am hoping this is not
necessary.

Reading the OnTrak help, it appear a Visual Basic code similar to
MSComm1.Output = "sk0" would work (http://www.ontrak.net/visual.htm),
however this does not appear to be an option in E-Prime.

Any pointers would be very appreciated. Thank you!

Erin

Paul Groot

unread,
Feb 20, 2012, 3:47:47 PM2/20/12
to e-p...@googlegroups.com
Hi Erin,

Although, in theory, it would be possible to use the WritePort command
to send bytes to a classical serial (non-USB) RS232 port, it is
definitely not the way to go. Instead you should use a SerialDevice
object to communicate with a COM port. The easiest way is to add such
a Serial device in the following dialog:
E-Studio>Menu>Edit>Experiment>Devices>Add Serial. The default setting
should be OK (9600bps, 8bit, no parity, 1 stopbit). When you add this
device, EPrime will add a global SerialDevice object variable to your
script. The name of this variable will be 'Serial' if there is only
one serial device.

The next thing you should do is to add a single line of inline script
to send the command:

SerialDevice.WriteString "sk0" & ebCr

The ebCr constant is a cariage return that is probably required by the device.

I'm not sure if the external device also needs to be initialised first
(by sending "CPA00000000" for example), but that's up to you to find
out ;-)

Hope this helps,
Paul

2012/2/18 Erin <erin.s...@gmail.com>:

> --
> You received this message because you are subscribed to the Google Groups "E-Prime" group.
> To post to this group, send email to e-p...@googlegroups.com.
> To unsubscribe from this group, send email to e-prime+u...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/e-prime?hl=en.
>

Erin

unread,
Feb 20, 2012, 7:07:26 PM2/20/12
to E-Prime
Thanks for the info Paul. I was thinking something like that may
work. In the past, I have successfully triggered a serial port pump
(via a usb to 9-pin serial port converter) in E-Prime sending text
commands using a serial.writestring inline. (I installed a driver for
the computer to recognize the serial-usb converter as a serial com
port.)

However, the equipment I am currently working with is a usb to usb
connection, and E-Prime does not recognize it as a serial port. When
I run the experiment with a serial device added, I get an "unable to
open port" error, even when I go through and try every com port. Is
there a way to send this signal through a traditional USB connection?
thanks!

Erin




On Feb 20, 3:47 pm, Paul Groot <pfc.gr...@gmail.com> wrote:
> Hi Erin,
>
> Although, in theory, it would be possible to use the WritePort command
> to send bytes to a classicalserial(non-USB) RS232 port, it is
> definitely not the way to go. Instead you should use a SerialDevice
> object to communicate with a COM port. The easiest way is to add such
> aSerialdevice in the following dialog:
> E-Studio>Menu>Edit>Experiment>Devices>AddSerial. The default setting
> should be OK (9600bps, 8bit, no parity, 1 stopbit). When you add this
> device, EPrime will add a global SerialDevice object variable to your
> script. The name of this variable will be 'Serial' if there is only
> oneserialdevice.
>
> The next thing you should do is to add a single line of inline script
> to send the command:
>
> SerialDevice.WriteString "sk0" & ebCr
>
> The ebCr constant is a cariage return that is probably required by the device.
>
> I'm not sure if the external device also needs to be initialised first
> (by sending "CPA00000000" for example), but that's up to you to find
> out ;-)
>
> Hope this helps,
> Paul
>
> 2012/2/18 Erin <erin.sieb...@gmail.com>:
>
> > I am trying to send a command to an external device via ausb
> > connection.  The external device is an ADU200USBRelay I/O Interface
> > (http://www.ontrak.net/ADUcommands.htm).  This is a control box which
> > triggers an automatic feeder for our monkeys.  Using the control box's
> > test software, I can trigger the auto feeder by sending the control
> > box the command "sk0."  So, I know I need E-Prime to send the command
> > "sk0" to the ADU200 control box via ausbCOM port.

Paul Groot

unread,
Feb 21, 2012, 5:20:26 PM2/21/12
to e-p...@googlegroups.com
Hi Erin,

Ah, I described a solution for a 'legacy' ADR device because you
linked to the RS232 example. But if I understand this correctly, you
are using an ADU (USB only) device...

However, if the device you have supports legacy RS232 connections, you
should try the following first because RS232 it is a bit easier to use
than the USB interface DLL: First check which (virtual) COM port is
being assigned by windows after installing the driver. If the USB
device connects as virtual RS232, you should be able to find it under
control panel>device manager->COM and LPT ports. Windows often assigns
a port number >4, which might be problemematic with EPrime (not sure
if this is less critical in EPrime 2.) Just try to change the port
number to the first available value below 4. If the PC has 1 or 2
physical COM ports, you should skip those numbers. Also note that the
port number often changes when a different USB port is used.

If RS232 is *not* an option (i.e. no new COM port is added when you
plugin the USB cable), you should use the DLL interface to connect to
the USB channels. EBasic supports calling functions in external DLL's,
so that should be no problem. To do this, you should declare all DLL
functions first. For example, you can put the following declarations
in the global user script section:

Declare Function OpenAduDevice Lib "AduHid.DLL" (ByVal iTimeout As
Long) As Long

Declare Function WriteAduDevice Lib "AduHid.DLL" (ByVal aduHandle As
Long, ByVal lpBuffer As String, ByVal lNumberOfBytesToWrite As Long,
ByRef lBytesWritten As Long, ByVal iTimeout As Long) As Long

Declare Function ReadAduDevice Lib "AduHid.DLL" (ByVal aduHandle As
Long, ByVal lpBuffer As String, ByVal lNumberOfBytesToRead As Long,
ByRef lBytesRead As Long, ByVal iTimeout As Long) As Long

Declare Function CloseAduDevice Lib "AduHid.DLL" (ByVal iHandle As Long) As Long

(more info here http://www.ontrak.net/ADUSDK/MinimalCompile-VB.html)

When the declarations are defined, you should be able to call the
functions in inline script just as if the functions are part of
EBasic:

' you would probably put this declaration also in the global section
Dim aduHandle As Long

'then in some inline script:
aduHandle = OpenAduDevice(0)

The VisualBasic example contains further details on the WriteAduDevice
function. Also don't forget to close the channel properly by calling
CloseAduDevice(aduHandle) before the end of the experiment.

best,
paul

2012/2/21 Erin <erin.s...@gmail.com>:

David McFarlane

unread,
Feb 22, 2012, 11:23:24 PM2/22/12
to e-p...@googlegroups.com
Erin,

I second Paul's suggestion that if possible you use a legacy RS232
connection because, put simply, E-Prime has absolutely no facility for
communicating through USB. Now in principle, such a facility can be
added -- in fact, I have used a USB device with E-Prime, but only
because that device came with a dll file of external routines which
could be accessed by using Declare statements in E-Prime. But short of
that, you are out of luck.

But please do not take my word for any of this. Please contact PST Web
Support at http://support.pstnet.com/e%2Dprime/support/login.asp , and
then write back here with their response.

-- David McFarlane

Erin

unread,
Feb 24, 2012, 5:04:51 PM2/24/12
to E-Prime
Thank you so much for the advice David and Paul. I also contacted PST
support, and they told me basically the same thing- that I would have
to use a custom DLL to communicate with a USB device (which is outside
the scope of PST support). Unfortunately, RS232 is not an option with
this particular device, so I will try Paul's second set of
suggestions. However, I was also able to find a control box from
OnTrak that supports RS232 connections... so that may end up being my
best bet. (I have had success in the past using E-Prime to trigger a
juice pump reward system on an RS232 connection.) Again, thank you
very much for the advice!

Erin





On Feb 22, 11:23 pm, David McFarlane <mcfar...@msu.edu> wrote:
> Erin,
>
> I second Paul's suggestion that if possible you use a legacy RS232
> connection because, put simply, E-Prime has absolutely no facility for
> communicating through USB.  Now in principle, such a facility can be
> added -- in fact, I have used a USB device with E-Prime, but only
> because that device came with a dll file of external routines which
> could be accessed by using Declare statements in E-Prime.  But short of
> that, you are out of luck.
>
> But please do not take my word for any of this.  Please contact PST Web
> Support athttp://support.pstnet.com/e%2Dprime/support/login.asp, and
> > (more info herehttp://www.ontrak.net/ADUSDK/MinimalCompile-VB.html)
>
> > When the declarations are defined, you should be able to call the
> > functions in inline script just as if the functions are part of
> > EBasic:
>
> > ' you would probably put this declaration also in the global section
> > Dim aduHandle As Long
>
> > 'then in some inline script:
> > aduHandle = OpenAduDevice(0)
>
> > The VisualBasic example contains further details on the WriteAduDevice
> > function. Also don't forget to close the channel properly by calling
> > CloseAduDevice(aduHandle) before the end of the experiment.
>
> > best,
> > paul
>
> > 2012/2/21 Erin <erin.sieb...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages