|
MOST of the time (but certainly not all of the time), close your connection between database calls. If you're going to make several subsequent calls one after the other, close it after the last one.
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass." - Dale Earnhardt, 1997
|
|
|
|
|
This depends on the application. If you have simple database tasks, closing and reopening is fine. But if you have several calls to the database in a single unit of work and you need (as you should need) transactions, you must keep the connection open at least to the end of the transaction.
Another point is that if you use notification mechanisms from database to the client, you'll need an open connection in order to receive notifications.
|
|
|
|
|
|
Hi all,
I'm seeking some quick tips to how to send and receive commands and data to/from a handheld device via a serial port. I've been handed the device (not your common off the shelf device but a specialised bit of kit) and a pdf with technical details of packet structures, i.e. Preamble, packet header, packet data.
The packet header is borken down into sections of consists of TYPE, SIZE, DSUM, HSUM.
TYPE - the command type, i.e. 0000 = Ping Connection, 0001 = Disconnect, 0101 get data, 0801 rest device etc...
SIZE - the size of the packet data
DSUM - Data check sum - addum sum of all bytes in data section to the checksum seed 55 (power of 16?)
HSUM - Packet header check sum - adding summ of all byte values in the packet header to the same seed value
Basically, where do I start? I also need to take into account timeouts etc.... Can I use standard .net libaries or best to purchase a 3rd party library?
Andrew
Andy
|
|
|
|
|
>> DSUM - Data check sum - add sum of all bytes in data section to the checksum seed 55 (power of 16?) <<
Am I right in saying that when the doc states check sum 5516 displayed next to it in a small font, the 16 refers to 16 bit?
I'm learning the hard way and not even started to look at coding anything in c# yet.
Andrew
Andy
|
|
|
|
|
sorry my earlier reply got lost. I asked the CP staff whether they could recover it somehow.
yes, a subscript of 16 would normally indicate hexadecimal notation, so 5516 would be 85 in decimal.
_awatts wrote: not even started to look at coding anything in c# yet.
then IMO a serial communication app is not a good choice, as it can be tricky at the application level even for an experienced programmer.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Thanks for the reply, simply confirming 5516 represents 16bit makes this document alot clearer.
If my packet structure is as follows
Preamble
SYNC - Word - A55A16
Packet header
TYPE - Word - 010116
SIZE - Byte - (data size)
DSUM - Byte - Data checksum using 5516 seed
HSUM - Byte - Header checksum using 5516 seed
Packet Data
Start - Byte - data[0]
Data - Data[...]
Am I therefore looking to create an array of bytes, the first 7 bytes for the Preamble and Packet header. Therefore the first two representing SYNC [A5,5A], the next two representing TYPE [01,01], the following byte holding the value for SIZE (number of bytes taken up by data), then the byte holding the value for DSUM, then the byte holding the value for HSUM. The 8th byte will hold a 0 (start of data), any bytes from here on holding the data?
If so, how do I calculate DSUM and HSUM?
Regards,
Andrew
Andy
|
|
|
|
|
_awatts wrote: how do I calculate DSUM and HSUM?
Haha, excellent question. There are hundreds of checksum definitions, some of them are standardized by ISO or by CCITT. And I could come up with a few that probably haven't been used yet... Your best hope would be it is described in the documentation. Failing that, you would have to ask the other party, or experiment by collecting a few short messages with correct checksum, then running them against all kinds of known checksum definitions until you find a match for each of the test messages.
Warning: yes a word seems to be two bytes in your context, however you also need to know which byte comes first: the high-value or the low-value (known as endianness: big-endian versus little-endian). Just looking at the start of a correct message (a SYNC word) should tell you.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Many thanks for your quick response and help.
Having never written a comminications program and based on your feedback I seem to be heading the right direction. I'll do what you've suggested, analyse a respose from the device in terms of packet size and structure, and try out a few different check sum methods to see which one yields the same result. That is if the device will send some data without having to raise a request to the device.
Again, thanks for your help.
Andrew
Andy
|
|
|
|
|
Some more ideas:
1. You're obviously an optimist. Any small mistake you will make while implementing some checksum algorithm is bound to go unnoticed and will output a non-matching value for sure.
2. If the device doesn't give any packets by itself, you could again look in the documentation, maybe there are examples.
3. If it is a commercial device, there is bound to be some PC software for it, so using that one could get it to work, then observe the packets that are going back and forth on the cable. If such software were managed code (e.g. C#) you could even use a tool such as Reflector to peek inside it.
4. You can of course look at incoming packets and ignore their checksums if you choose to do so. The data still would be useful most of the time; the checksums are there to protect you against communication mishaps that would yield false packets.
5. You probably do need to provide correct checksums when sending data to the device, although I have met a few systems that accept an "I don't care" value too, which always has been zero in my experience. Note: I do not recommend serial communication without some kind of protection, I'm just pointing a possible and temporary approach that could get you started. Does the documentation state what the device will do when it gets a packet with a bad checksum?
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
>>2. If the device doesn't give any packets by itself, you could again look in the documentation, maybe there are examples<<
Unfortunatley no examples. I'll try and contact the company who made the device.
>>3. If it is a commercial device<<
Nope. A specialist device only used within the healthcare industry. Previous version written in VB compiled as a Win32 app. I've been tasked to write a replacement without original source.
Andy
|
|
|
|
|
_awatts wrote: Previous version written in VB compiled as a Win32 app
So you can still run the device and observe actual good packets? That is good.
BTW: you should insist on good documentation! You did pay for the device, didn't you? So demand quality docs.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Go to this link and read the answer of that question.......
I think it will solve your all problems...........
|
|
|
|
|
Following is the general way to interact with your COM Port
try
{
sp.PortName = "COM1";
sp.BaudRate = 9600;
sp.DataBits = 8;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.DataReceived += new SerialDataReceivedEventHandler(read_data);
sp.Open();
sp.Write("AT" + Environment.NewLine);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
|
|
|
|
|
I've never had to do this before, and it's a Monday so my brain is not all here yet. I did try google first, but found nothing very helpful. I have a form application that can be started directly or via commandline passing a parameter, however, I need to debug the code in VS when I start it via commandline. What is the best way to do this?
"Life should not be a journey to the grave with the intention of arriving safely in a pretty and well preserved body, but rather to skid in broadside in a cloud of smoke, thoroughly used up, totally worn out, and loudly proclaiming "Wow! What a Ride!"
— Hunter S. Thompson
|
|
|
|
|
Two ways...
Method 1: Go into the project properties, debug section, and enter the command line parameters there
Method 2: Start it manually, then do a Debug > Attach to Process... But if you do it this way, you miss the startup... You could always put a "Press any key to continue" at the start for debugging purposes.
|
|
|
|
|
Thanks Ian, the first method wasn't applicable because my program was called via 3rd party app that provided different commandline parameters so I couldn't do this. I was trying the second method, but I was missing the startup.
Ian Shlasko wrote: You could always put a "Press any key to continue" at the start for debugging purposes.
Is what worked for me.
"Life should not be a journey to the grave with the intention of arriving safely in a pretty and well preserved body, but rather to skid in broadside in a cloud of smoke, thoroughly used up, totally worn out, and loudly proclaiming "Wow! What a Ride!"
— Hunter S. Thompson
|
|
|
|
|
Glad to help
|
|
|
|
|
I have a plain XML data file that I want to read into a hierarchy of classes. I'm not sure how do do this. Can someone point the way?
Thanks
Everything makes sense in someone's mind
|
|
|
|
|
Well, if the XML tags correspond to class names in a predefined namespace, you can use reflection to invoke the constructors, then more reflection to assign child properties (Maybe have each class implement an interface so you know where the children go)...
Alternatively, you can use something like a factory pattern and recurse through the XML tree manually, which gives you more capability and flexibility while requiring a lot more code both at the beginning and when things change down the road...
Kind of depends on the specifics of the situation.
|
|
|
|
|
There are 2 levels in the XML, and I have classes for both. I'm defining the XML, so I can do this any way I want. I just don't know how to.
I was hoping for some method of automatically loading the XML into a class hierarchy.
Everything makes sense in someone's mind
|
|
|
|
|
Well if this is a load/save kind of feature, you could always just go with serialization. That won't give you very readable XML, but it makes things incredibly easy.
If you intend to create the XML files manually, I'm thinking you'll want something simpler and more flexible than what serialization would give you, so it won't be automatic.
|
|
|
|
|
Ian Shlasko wrote: That won't give you very readable XML
Why not?
I know the language. I've read a book. - _Madmatt
|
|
|
|
|
Have you ever used XML serialization? They throw in a ton of garbage tags, meta data, etc. to support various features. I wouldn't say its "unreadable", but you would definitely look at it and say "WTF!! why does this XML have so much crap in it?"
|
|
|
|
|
Then use the attributes correctly when creating your objects to serialize. You can also override the methods to create your own structure if necessary.
SledgeHammer01 wrote: why does this XML have so much crap in it?"
The answer is. It doesn't have to.
I know the language. I've read a book. - _Madmatt
|
|
|
|