Click here to Skip to main content
14,738,360 members
Please Sign up or sign in to vote.
3.00/5 (2 votes)
See more:
Hi All,

Asked a stupid question earlier about string arrays and found the answer myself after typing the question (thanks also to Manfred R. Bilhy) so I hoping to do this again. I have to send a group of strings from the serial port to a waiting board.
I have comms to the board I can sent and recieve data as well it is just I can't get it to upload all the data:
for (int b = 0; b <= 5; b++)
         {
             Command = CommandA[1] + '\n' + '\r';
             rtbIncoming.SelectionStart = rtbIncoming.Text.Length;
             rtbIncoming.ScrollToCaret();
             Length_Command = Command.Length;
             for (int Counter = 0; Counter <= Length_Command + 1; Counter++)
             {
                 if (Counter == Command.Length)
                 {
                     return;
                 }
                 Command_Sent = Command.Substring(Counter, 1);
                 myComPort.Write(Command_Sent);

             }

That is the for loop thats being the problem the method of writing out works (bit of a kludge I worked out ages ago.
Using a Serial Port Monitor I can tell it replies to my command with 0D or Carriage Return, the text OK and an OD and a > prompt.
Anybody Any Ideas?
Glenn
Posted
Comments
Ed Nutting 9-Dec-11 8:56am
   
Your code seems self defaeting - you run the second loop from 0 to Command Length + 1 yet in the loop you have an if Counter == Length_Command. Meaning the loop only really runs from 0 to Command.Length : did you mean this?
Jephunneh Malazarte 9-Dec-11 9:19am
   
what is the possible value for your CommandA[1]?
glennPattonContracting2 9-Dec-11 9:32am
   
to Edward Nutting, That works like I said its a kludge to get around the awkward way this microcontrollers on board UART runs, if I didn't send individual characters the board ignors it.
to Jephunneh Malaztre CommandA[1] contains "SLD:0002:4181246867"
Timberbird 9-Dec-11 9:42am
   
What is the outer (for (int b = 0; b <= 5; b++)) loop for? return will exit this method as soon as you reach Length_Command. Should Command value be changed inside that second loop?
glennPattonContracting2 9-Dec-11 9:48am
   
Thanks, that looks like it, a quick test shows it is getting past if I change the return to a break!!!
Timberbird 9-Dec-11 9:52am
   
Well, it should :). Breaks only interrupt current cycle, while return forces your program to leave the function
glennPattonContracting2 9-Dec-11 10:35am
   
I miss ANSI C and DOS :) any good ideas for waiting for an OK from the board.
Addy Tas 9-Dec-11 17:46pm
   
Add another thread for reading and validating the read data, then if you got what you want set a event; the other side (writer) needs to wait for the event before it does something.

To avoid any other issues; please make your design to also wait for an exit event and use a timeout to verify the current state / resend the command.

We use Advanced Serial Port Monitor by AGG its quite good. I added the dreaded Thread.Sleep and got an odd reaction. I hate to say it but I think the board is not playing nicely!
   
If your board wait an only character, may be this loop is too fast, so your microcontroller program considere it a many chars. Have you tried to add a sleep between successive writes ?

Addy Tas, suggest to read in another thread, i agree. But the mono-threaded microcontroller probably do not need that. I have the intuition you can simply block while getting your replies.
You can easily wait using a loop like this one :

while(myComPort.BytesToRead ==0) 
   ;


Which is a dangerous inifnite loop if nothing happend, can be worked around with something like this (i don't have the code here, but it should be something like that)

public int WaitForData(int NbDataToWait, int Timeout)
{
    int timeWaited = 0;
    int timeToWait = 1; // 1 ms
    while (timeWaited < Timeout && MyCompPort.BytesToRead < NbDataToWait)
    {
        timeWaited += timeToWait ;
        System.Threading.Thread.Sleep(timeToWait );
    }
    return timeWaited;
}
   
Comments
glennPattonContracting2 12-Dec-11 6:10am
   
I have used a similar routine in the past, but experience some problems with the BytesToRead method I will when my PC sorts it self out give it a go!, a question though the System.Threading.Sleep() is it no an evil Thread.Sleep on the UI thread?
Romain TAILLANDIER 12-Dec-11 7:54am
   
Thread.sleep is not recommanded on UI thread that's right. But if it sleep a very few time (less than 200-300), user can't observe the delay. You can add Application.DoEvents() in the sleep loop, to let the user have the control, and the UI refreshing good. You also can freeze the UI while the program communicate with the peripheral, simply by activate a wait cursor (this.Cursor = Cursors.Wait;)

According to my experience, i drove tens of rfid peripherals using C#, massively constructed on waiting for ByteToRead > 0, and i never experienced problems using this, since the SerialPort class exists on compact framework 2. (didn't exists in CF1).
Most of the peripheral i drive are self maid one based on microchip PIC microcontrollers. Do you now ASPYCOM[^]?
It allow you to spy a com port and see if your program and your peripheral communicate as waited

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900