|
I would say look into this[^] MSDN site. This website was discovered by looking through links on this[^] message thread. Hope these help,
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
Hey guys, ive ran into a little problem here.. im interfacing with an unmanaged c++ dll in my c# application.
the dll structure is as follows:
APIENTRY ReadImage(
hInstance hObject,
unsigned char* pData,
unsigned long dataSize);
with pData being the top address of the image reading buffer allocated by the calling application.
how would i declare a variable in c#, allocate a specific ammount of memory to it, then return the
memory address of said variable. this is got me stumped :/
|
|
|
|
|
Take a look at System.Runtime.InteropServices.Marshal and associated information
|
|
|
|
|
Thanks for the info mike, i took a look at the class but i still have no idea how to pass the memory address as a parameter to the dll.
|
|
|
|
|
|
Off the top of my head, I would expect you to pass in a StringBuilder object as pData.
|
|
|
|
|
Pete O'Hanlon wrote: I would expect you to pass in a StringBuilder object as pData.
Given the name of the function is ReadImage I assumed it would not be text data and therefore StringBuilder would not work?
|
|
|
|
|
Hi,
assuming the native function expects to get a buffer of sufficient size, this is
how you should do it:
- include a line using System.Runtime.InteropServices; // DllImport
- declare the native function as
[DllImport("myLibrary.dll")]
private extern static int ReadImage(IntPtr hObject, IntPtr pData, ulong dataSize);
- allocate an array of sufficient size (type is byte, uint, whatever you like);
- use class GCHandle methods Alloc (GCHandleType.Pinned) and AddrOfPinnedObject to get
pointer you need (an IntPtr). Pinning prevents the GC to move the array object around
until it gets freed again.
- call the native function as if it were part of your class (the extern static declaration
makes that possible)
- use GCHandle.Free to undo the pinning
|
|
|
|
|
Hi there.
I have an USB Device whick have to small functions.
It should be possible if I write 'GET' to it, it should then return a integer value. And if I write 'RES' it should reset the Integer value.
The Device is connected to my Computer with a USB-Serial cable. I have installed a driver i got with the cable.
I have tried using LibUsbDotNet, but when i tries to open a connection to the device the program just crashes and i cant do anything.
Anyone who can tell how to communicate with my device?
|
|
|
|
|
You said it was connected using a USB Serial cable?? Is the device exposed on a COM port?? Like COM1, COM2, Com3, ... Try talking to it over the serial port instead of going through the headache of using the devices' drivers.
|
|
|
|
|
The device has a serial port, so i have connected it to an USB port using a USB-Serial cable.
|
|
|
|
|
Then the device is more-than-likely exposed on a normal COM port. You can probably get to it using any terminal emulator software that uses serial communication (like HyperTerminal). If so, then you can use the SerialPort class in the .NET Framework 2.0 (System.Io.Ports namespace) to talk to it from your code.
|
|
|
|
|
Ok. Sounds great.. thanks
I will buy a serial cable tomorrow and try it..
|
|
|
|
|
Could this be a possible way to call the GET function on the device?
<br />
SerialPort sp = new SerialPort("COM1");<br />
<br />
sp.Write("GET");<br />
char[] buffer = new char[64];<br />
int ans = sp.Read(buffer, 0, 64);<br />
|
|
|
|
|
In a very, very "quick'n'dirty" implementation, no. You still have to give the SerialPort class constructor the parameters the device is expecting for serial communication, like which COM port (you already have it), baud rate, parity, data bits, and stop bits.
Then you need to Open the port before you try to read/write from it. Then you need to Close the port when you're done.
Read this...[^]
|
|
|
|
|
You just told me you HAD a serial cable and had the device connected to it...??
|
|
|
|
|
I told you I had a USB-Serial cable connected to it.. It is an adapter from Serial to USB.. The port on the device is Serial and on the computer it has to be USB.
|
|
|
|
|
Hi again..
I found out that the Computer the device has to be connected to, does not contain any serial port.. So I have to use USB to this.
Is it really that hard to communicate with an USB port?
|
|
|
|
|
haolan wrote: Is it really that hard to communicate with an USB port?
You don't talk to a USB port. USB is not really a port. What does USB stand for?? "Universial Serial BUS". It works more like the slots inside the computer, not like the ports on the back of it.
Yes, it's THAT difficult. You don't take to the bus itself. You talk to each device using whatever methods that device exposes. That could be through drivers, Device I/O calls, normal file system functions, or, in your case, through a COM port.
|
|
|
|
|
Ahh ok..
I connected the device again, and found out that if I run:
string[] ports = SerialPort.GetPortNames();
foreach (string p in ports)
{
Console.WriteLine(p);
}
It has created a new COM port named COM6. So i guess i should be able to communicate with my device through that port?
I have created the following code for communication:
SerialPort sp = new SerialPort("COM6", 1200, Parity.None, 8, StopBits.One);
try
{
sp.Open();
sp.Write("GET");
sp.ReadTimeout = 10000;
string ans = sp.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
sp.Close();
}
I get timeout when I am waiting for answer, but I guess it could be a mistake of how to communicate with the device.
|
|
|
|
|
haolan wrote: It has created a new COM port named COM6. So i guess i should be able to communicate with my device through that port?
Probably. Noone except you can relly tell that. Open up HyperTerminal, set the port to COM6, set the parameters to what the device expects, connect, type in your commands and see what happens.
haolan wrote: SerialPort sp = new SerialPort("COM6", 1200, Parity.None, 8, StopBits.One);
If you don't get a response, or you get a response containing garbage, then you've most likely either got the wrong COM port, or got the communication parameters wrong.
|
|
|
|
|
The communication parameters should be ok.
My laptop is a bit weird though.. It has a lot of COM ports (from 3 to 16).. When i connect my device it has two COM3 ports, I hope that it wont make any trouple with my communication..
But how do I use HyperTerminal for such a thing? When I open HyperTermial it seems that it only can communicate with Modems??
|
|
|
|
|
haolan wrote: When i connect my device it has two COM3 ports,
Yeah, that's a problem. You can't have multiple ports having the same COM number.
haolan wrote: It has a lot of COM ports (from 3 to 16)..
Why so many?? I hope this isn't normal for your machine...
haolan wrote: When I open HyperTermial it seems that it only can communicate with Modems??
HyperTerminal talks to any serial device, not just Modems. BTW, a modem is just another serial device. All you do is launch HyperTerminal, give the session a name, pick the COM port you want to use, give it the communication parameters, and go...
|
|
|
|
|
I do not know why there are so many ports.. It doesn't have any physical comports.
But nevermind.. I got my program to work.. The only problem was that the baudrate was only 1200, so I had to wait a little time after I have wrote the GET method to the device before trying to read from it.
I have tried in a windows application to add a timer, but that doesn't seem to work, but if I place a for (int i; i < 100000; i++) between the read and write, it probably works fine. I really cant figure out what the difference is. I gotta find out, because the program can be run at different CPU's. Maybe you have a solution?
Another thing that I am worried about is the COM Port name. It is different for each computer I connect it to..
Is there any way to find out which COM port my device is connected to?
|
|
|
|
|
You can't simply put a Write, then a Read, then a Write for the next command, then a Read, ..., in order an expect it to work. Your design is going to have to be much more flexible, like writing a method to send a command, another method to setup an asynchronous read of the port, another method to handle timeouts. A timer is completely useless to you.
<blockquote class="FQ"><div class="FQA">haolan wrote:</div>Another thing that I am worried about is the COM Port name. It is different for each computer I connect it to..
Is there any way to find out which COM port my device is connected to? </blockquote>
The only way to know is to go through each COM port on the machine and issue some command to it that the device understands and responds to. If the response in what you expect, you found the device. There is no other way to do it.
|
|
|
|