|
Set up a separate folder in your email client.
CC. yourself in those cases you send from other than "home".
As mail comes in, "move" it to the appropriate folder (I prefer manually; or you can set up incoming "rules").
Can archive the folder; delete it; etc. when appropriate.
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Sounds like a good idea thanks Gerry.
I still would like a off-line program to collect the text but your idea is a good start.
Brian
|
|
|
|
|
plz help me , i want to draw a real time graph that read data from an arduino, this is the Code :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using ZedGraph;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
string DataFromCOM;
double[] x = new double[100];
double[] y = new double[100];
int i;
PointPairList listPointsOne = new PointPairList();
LineItem myCurveOne;
public Form1()
{
InitializeComponent();
}
private void btnExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void btnConnect_Click(object sender, EventArgs e)
{
serialPort1.PortName = txtComPort.Text;
serialPort1.BaudRate = Convert.ToInt32(txtBaudrate.Text);
if (serialPort1.IsOpen) return;
serialPort1.Open();
btnConnect.Enabled = false;
btnDisconnect.Enabled = true;
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen==false) return;
serialPort1.Close();
btnConnect.Enabled = true;
btnDisconnect.Enabled = false;
}
private void Form1_Load(object sender, EventArgs e)
{
updateports();
Z1test();
}
private void Z1test()
{
GraphPane myPane = Z1.GraphPane;
Z1.IsShowPointValues = true;
myPane.Title.Text = "Test";
myPane.XAxis.Title.Text = "RealTime";
myPane.YAxis.Title.Text = "Value";
i = 0;
}
private void updateports()
{
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
txtComPort.Items.Add(port);
}
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try {
while (serialPort1.BytesToRead > 0)
{
DataFromCOM = serialPort1.ReadLine();
if (DataFromCOM.Trim() != "")
{
int iDAT = Convert.ToInt32(DataFromCOM);
i++;
x[i] = i;
y[i] = iDAT;
}
}
}
catch { }
}
private void timer1_Tick(object sender, EventArgs e)
{
txtKQ.Text =DataFromCOM;
Z1.GraphPane.CurveList.Clear();
Z1.GraphPane.AddCurve(null, x, y, Color.Red, SymbolType.Square);
Z1.GraphPane.AddCurve(null, listPointsOne, Color.Red);
Z1.AxisChange();
Z1.Invalidate();
}
}
}
|
|
|
|
|
IlYes Del_SaVior wrote: this is the Code And what is the problem?
|
|
|
|
|
it doesn't draw .. i dont know where is the problem .
|
|
|
|
|
So start from the beginning and work out where the problem is.
Start by disabling the serial port, and adding random values in your tick handler. Does that do what you wanted - does the graph change each tick?
If it does, then start looking at the serial port.
If it doesn't, then look at the timer, and prove that's working at the interval you expect.
If it is, then look at your graphing package and work out why it's not updating.
If it isn't, then look at why.
Reduce the problem to smaller and smaller areas - it's one of the key parts of both design and debugging!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
You need to use the debugger to find out what is happening. Check that you are receiving valid data from the serial port, check the drawing code is actually doing something, etc.
|
|
|
|
|
You need to confirm that you can RECEIVE independently of any charting; and that you can CHART, independent of any receiving. You have done neither. Charting depends (eventually) on receiving. Where to start?
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Hi,
I see several problems:
1.
as other have said already, you should divide and conquer; do not write all the code and then come to the conclusion it doesn't work. Instead chop the task into many smaller tasks and solve them one by one.
2.
NEVER use an empty catch; when an exception occurs, it does so because something is wrong; catching the exception and looking at it will tell you more. It is there to help you. You could display the Exception.Message with a MessageBox. It is better to display the entire Exception.ToString() result as that includes exact line numbers. And I prefer to log all exceptions to a text file, which doesn't disturb the timing aspects as much as interactive debugging. See A simple logging scheme[^]
3.
The DataReceived event will run code on another thread (proof: Asynchronous operations run on ThreadPool threads[^]) , and I trust ZedGraph (as any other WinForms Control) does not work well (or at all) on any thread that did not create it, normally called the GUI thread. So you will be getting cross-thread exceptions. Read more about it here: Invalid cross-thread operations[^]
4.
The DataReceived event fires when one of a few bytes got received, it does not care about lines of text, or whatever constitutes a "message". And (nowhere documented) as long as one DatReceived handler is running, no more such events will happen. Now what happens when you receive a few bytes not including a NewLine? The event may fire, get to your SerialPort.ReadLine() and wait there forever.
The solution here depends very much on the specifics of your peripheral. If data throughput is low and some delay is acceptable, a work-around might be to put some delay (say Thread.Sleep(100) ) just before the call to ReadLine(). And yes, that is an ugly hack, but it sometimes suffices.
You should take care of all of the above and then you may be successful!
|
|
|
|
|
I agree that the problem should be split into small pieces and that verifying the serial side of things would be a good place to begin.
Can we see the instructions from the arduino that actually transmit the data, the fact you are using a micro controller gives you a certain degree of control over the serial protocol.
I assume the data is being transmitted in a loop, how fast is the controller repeating the transmission loop and at what baud rate.
If the transmission is too fast then it might not be possible to process the incoming and update a chart at the same time without buffer over run, which would be pointless anyway because you would be unable to read the chart as it updated at those speeds, this can be overcome by storing the data in memory and displaying it at a slower rate but this also has its limitations.
|
|
|
|
|
I think you wanted to reply to the OP, not me...
|
|
|
|
|
Apologies Luc, bear with me please I will get there eventually.
|
|
|
|
|
|
I am re-posting this because for some odd reason I posted first time in the wrong place, if this is wrong also I am not sure what I will do but here goes.
I agree that the problem should be split into small pieces and that verifying the serial side of things would be a good place to begin.
Can we see the instructions from the arduino that actually transmit the data, the fact you are using a micro controller gives you a certain degree of control over the serial protocol.
I assume the data is being transmitted in a loop, how fast is the controller repeating the transmission loop and at what baud rate.
If the transmission is too fast then it might not be possible to process the incoming and update a chart at the same time without buffer over run, which would be pointless anyway because you would be unable to read the chart as it updated at those speeds, this can be overcome by storing the data in memory and displaying it at a slower rate but this also has its limitations.
|
|
|
|
|
One more question...
In C# you have
'animal fox = new animal()'
Why do you need to repeat the word animal? Why not have 'fox = new animal()'
Brian
|
|
|
|
|
So that C# "knows" what kind of objects can be put in it!
Remember that a variable can contain an instance of the type it was declared as, plus any derived types.
So is you have a class hierarchy:
class Animal {}
class Mammal : Animal {}
class Birds : Animal {}
class Fish : Animal {}
class Reptiles : Animal {}
class Amphibian : Animal {}
class Fox : Mammal {} Then declaring createurs is legal:
Fox fox = new Fox(); And
Mammal mammal = new Fox(); And so is this:
Bird eagle = new Eagle(); And you can do this:
Animal animal = fox;
animal = eagle;
animal = mammal; But you can't do this:
eagle = fox; Or this:
eagle = mammal; Or even:
fox = eagle; Because they don't make any sense in a real world.
Telling C# what type of object a variable can contain means it can catch errors at compile time instead of when your program is running, which makes your code both easier to read and more reliable.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Thanks Griff for the examples
If you have this code:
class Bird : Animal {}
Bird eagle = new Eagle();
then saying
animal = eagle;
is like saying
animal = animal
as they both should have the same properties.
Please correct me if I'm wrong
I see what you mean by real world. A bit like saying circle = square
Brian
|
|
|
|
|
public class Animal
{
public void Breathe() {}
}
public class Bird : Animal
{
public void FlapWings() {}
}
public class Eagle : Bird
{
public void DiveVeryQuicklyOntoOtherBird(Bird target) {}
}
...
Bird eagle = new Eagle();
Animal animal = eagle; That's completely legal because Eagle is derived from Bird, which derives from Animal: an Eagle is a Bird, which is an Animal.
But ... it's legal to say these:
eagle.FlapWings();
eagle.Breathe(); Because eagle is a variable containing a Bird instance (or an instance of a class derived from Bird ), so it has all the properties and methods of a Bird as well as those of an Animal
But ... you can't do this:
eagle.DiveVeryQuicklyOntoOtherBird(myPigeon); Because not all the types that can be held in a Bird variable are Eagle s; they could be any Bird - so they don't all support the DiveVeryQuicklyOntoOtherBird method - despite the variable currently containing an instance of an Eagle the system doesn't "know" that it always will; at a later point you could replace it with
eagle = new Sparrow(); which can't dive really quickly like an apex predator!
To use the method you'd need to cast the instance:
((Eagle)eagle).DiveVeryQuicklyOntoOtherBird(new Sparrow());
Or use an Eagle variable.
If you try to cast a Sparrow to an Eagle, you will get an error at run time, because that's the only time when it can check if the conversion is possible.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Thanks Griff.
I liked examples like these you've given me.
You wrote::
eagle = new Sparrow()
I thought you may have to use:
Bird eagle = new Sparrow()
.
Is it because you have already defined the eagle as a bird (Bird eagle = new Eagle();) that you don't need to do this?
Brian
|
|
|
|
|
If you do this:
private void DoSummat()
{
Bird eagle = new Eagle();
...
eagle = new Sparrow();
...
} You are just reusing the existing variable, like you do without worrying about classes:
int i = 1;
while (true)
{
Console.WriteLine(i);
i = i + 1;
} If you tried to create a new variable with the same name in the same scope:
private void DoSummat()
{
Bird eagle = new Eagle();
...
Bird eagle = new Sparrow();
...
} You would get an error as it already exists - just the same as you can't do this:
for (int i = 0; i < 10; i++)
{
Console.Write($"{i} :");
for (int i = 100; i < 110; i++)
{
Console.Write(i);
}
Console.WriteLine();
} You can't have two loop guards with the same name!
Or even this:
private void DoSummat(int x)
{
int x = 666;
...
} Because the parameter and variable are the same name.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Now I've had some coffee, I'll add some thoughts for you.
If you allowed
fox = new animal(); without the type specifier, what problems might it cause?
Well, consider this:
public animal fox { get; set; }
public void DoSummat(animal a)
{
fox = a;
...
} Is the fox assignment inside DoSummat meant to create a new local instance which is scoped to just the method, or to affect the public property? How could you tell? How could I tell when I tried to fix a problem in 100,000 lines of code next year?
Worse, is fox supposed to be an animal , or a mammal , or a Canidae ? Does it make a difference? Yes - it does. Because bird is a type of animal but a fox doesn't have a FlapWings method! So if you allow implicit typing, then the compiler has to assume the lowest common type in the hierarchy and that could mean that methods you expect to work just don't exist for that actual instance.
And consider this:
public void DoSummat(animal a)
{
fox = a;
...
fax = b;
...
} Isfax a new variable, or did I mistype fox ? How would you tell?
C# is a strongly typed language: which means that there is no implicit declarations, no automatic type changing (except where data won't be lost such as int to double for example), and heavy duty type checking - which makes your code more robust because it finds problems at compile time, instead of hoping you tested all the possible routes through the code and didn't leave a "bad type" in there.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I do like the way you need to define all variables in C# unlike Python where you could start by attaching a string to a variable then later in the code attach a number to the same variable. Python accepts this without giving any errors
It can cause lots of problems in getting a program to work correctly.
Speaking of languages I wonder what happened to Visual Basic which was once a popular language. It's no longer in the top 10 popular languages.
I suspect C# would be popular with people who have learnt C and C++ as it's simlar in some ways to those languages.
I decided to learn C# as I wanted a language to create programs in Windows (that were exe) that had a console and would run fast. Also I prefer compiled code to scripting code.
Brian
|
|
|
|
|
Some good caffeine in there !
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
|
|
|
|
|
Heavy duty wake up juice!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
OriginalGriff wrote: without the type specifier, what problems might it cause?
Hmmm...I can see the compiler struggling a bit with the following....
var fox = new;
|
|
|
|