954,514 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Sending chars to serial port from double

hey everyone,

we have an argument that figured up the angle in a double. We need to convert that double to a char and send it out the serial port. I've tried this:

char t1 = (char)A;
            comBobbySue.Write(A);


but i get errors. can someone give me a hand? :(

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

Would you be able to convert the double to a string, then loop through the string and pass that on to the com?

//Might want to use a format provider here
string s = A.ToString();
foreach(char c in s)
{
comBobbySue.Write(c);
}
dickersonka
Veteran Poster
1,175 posts since Aug 2008
Reputation Points: 130
Solved Threads: 143
 

yeah maybe. Is there any way to send an Int or Double to the COM port?

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

Yes, I thought you made a custom wrapper around it that only accepted a char.

Anyways here's a link
http://forums.msdn.microsoft.com/en-US/netfxbcl/thread/ebf6b7f4-123c-4de0-b331-2ea74769c94d/

dickersonka
Veteran Poster
1,175 posts since Aug 2008
Reputation Points: 130
Solved Threads: 143
 

awesome, thanks. I'll test that out tonight.

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

awesome, it's working great. Here's the only problem I've run into.

I'm sending angles to the controller. So when I get to angle 256, it errors out because of the maximum size of the Byte.parse

Can I use something larger than this? I just need something that will accept 360ish

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

You can use this method, might want to change your previous method before too.

That method takes both strings and doubles

byte[] buffer_2_send = BitConverter.GetBytes(256);
dickersonka
Veteran Poster
1,175 posts since Aug 2008
Reputation Points: 130
Solved Threads: 143
 

oh cool. So I can specify how many bits to take in?

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

not sure what you mean by how many bits to take in, you can always make the byte buffer any size you want

the method above converted the int 256 into a byte buffer, so you didn't need to use Byte.parse with a fixed size of 1 for the byte buffer

dickersonka
Veteran Poster
1,175 posts since Aug 2008
Reputation Points: 130
Solved Threads: 143
 

Ok I'm a little confused.
Say I want to send the double A out the COM port. what would be the easiest way?

I've got it working to where it will parse the text box, but there's got to be a way to just convert the double itself.

Thanks for the help

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

BitConverter is overloaded to accept double, int, and string i believe.

you can parse a double out of the textbox

double d = Double.Parse(TextBox.Text);
byte[] buffer_2_send = BitConverter.GetBytes(d);


I think this is what you meant, but if not, what are you meaning by 'just convert the double itself'?

dickersonka
Veteran Poster
1,175 posts since Aug 2008
Reputation Points: 130
Solved Threads: 143
 

Ok, that answers my question. I'll try it when I start working on the program again.

We already have D computed from a previous section of code. I just wanted to know if there was a way to use D directly, without using the textbox.

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

You can pass in any value, i just made a simple example of getting a string from a textbox

if you calculate it, just pass in the calculated value and set d to the value

dickersonka
Veteran Poster
1,175 posts since Aug 2008
Reputation Points: 130
Solved Threads: 143
 

I can't get it to work that way. Here's the code I tried:

byte[] outBufferAngle = BitConverter.GetBytes(A);
            byte[] outBufferVelocity = BitConverter.GetBytes(V);

            comBobbySue.Write(outBufferAngle, 0, outBufferAngle.Length);
            comBobbySue.Write(outBufferVelocity, 0, outBufferVelocity.Length);


V and A are both doubles that have been calculated earlier. When I send the buffer out of the COM port, I don't get the correct output.

For example if I send

A = 90
V = 25

V is output as Hex 00 rather than Hex 19.

If I try to send

A = 160
V = 45

V is output as Hex 47 rather than Hex 2D.

The output is random for every time it's sent. Could this have anything to do with the unpredictability of the value after the decimal point? At any given point, A or V could have the value of x.329847 or some other non-integer number.

Duki
Nearly a Posting Virtuoso
1,475 posts since Jun 2006
Reputation Points: 817
Solved Threads: 32
 

Very well may have to do with the decimal, if you are just using int's stick with int's. I forgot about passing double with a decimal point after. Take a look at this to convert double to hex.

http://www.codeguru.com/forum/showthread.php?t=371326

dickersonka
Veteran Poster
1,175 posts since Aug 2008
Reputation Points: 130
Solved Threads: 143
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You