我想做一个程序每100ms从串口读数据保存,每500ms从将得到的数据波形显示,先做的保存以下是代码
namespace _0090107
{
public partial class Form1 : Form
{
SerialPort port1 = new SerialPort();//实例化串口类
public Form1()
{
InitializeComponent();
}
private const string FILE_NAME = "record.dat";
public static void WriteFile(string str)//存储方法
{
System.IO.StreamWriter sr;
if (System.IO.File.Exists(FILE_NAME)) //如果文件存在,则创建File.AppendText对象
{
sr = System.IO.File.AppendText(FILE_NAME);
}
else //如果文件不存在,则创建File.CreateText对象
{
sr = System.IO.File.CreateText(FILE_NAME);
}
sr.WriteLine(str);
sr.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
port1.ReadBufferSize = 1048576;//设置串口通信参数
port1.PortName = "COM11";
port1.BaudRate = 115200;
port1.Parity = 0;
port1.ReadTimeout = 1000;
port1.DataBits = 8;
port1.StopBits.Equals(1);
port1.Open();
} private void button1_Click(object sender, EventArgs e)//单击事件
{Thread myThread = new Thread(new ThreadStart(save));//创建新线程
myThread.Start();
}
private void save()
{
while (port1.BytesToRead>0)
{
DateTime dt1 = DateTime.Now;
int data = Convert.ToInt32(port1.ReadLine());
string abc = Convert.ToString(data);
WriteFile(abc);
if (DateTime.Now - dt1 > new TimeSpan(100))
{
break;
}
else
{
Thread.Sleep(Convert.ToInt32( 100 - (DateTime.Now - dt1).TotalMilliseconds));
}
}
} }
}现在的问题是我必须点一次button1才会读进一个新数据,可我希望的是点一下之后,就不用管了,每100ms保存一个,自动的,我试过把创建新线程放在一个timer_tick里,但是有人告诉那样不好,所以我用了while。或者我用readline()是一种错误,该用readbyte(),将他们放到一个数组,真的糊涂了,希望各位朋友帮忙解答。
namespace _0090107
{
public partial class Form1 : Form
{
SerialPort port1 = new SerialPort();//实例化串口类
public Form1()
{
InitializeComponent();
}
private const string FILE_NAME = "record.dat";
public static void WriteFile(string str)//存储方法
{
System.IO.StreamWriter sr;
if (System.IO.File.Exists(FILE_NAME)) //如果文件存在,则创建File.AppendText对象
{
sr = System.IO.File.AppendText(FILE_NAME);
}
else //如果文件不存在,则创建File.CreateText对象
{
sr = System.IO.File.CreateText(FILE_NAME);
}
sr.WriteLine(str);
sr.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
port1.ReadBufferSize = 1048576;//设置串口通信参数
port1.PortName = "COM11";
port1.BaudRate = 115200;
port1.Parity = 0;
port1.ReadTimeout = 1000;
port1.DataBits = 8;
port1.StopBits.Equals(1);
port1.Open();
} private void button1_Click(object sender, EventArgs e)//单击事件
{Thread myThread = new Thread(new ThreadStart(save));//创建新线程
myThread.Start();
}
private void save()
{
while (port1.BytesToRead>0)
{
DateTime dt1 = DateTime.Now;
int data = Convert.ToInt32(port1.ReadLine());
string abc = Convert.ToString(data);
WriteFile(abc);
if (DateTime.Now - dt1 > new TimeSpan(100))
{
break;
}
else
{
Thread.Sleep(Convert.ToInt32( 100 - (DateTime.Now - dt1).TotalMilliseconds));
}
}
} }
}现在的问题是我必须点一次button1才会读进一个新数据,可我希望的是点一下之后,就不用管了,每100ms保存一个,自动的,我试过把创建新线程放在一个timer_tick里,但是有人告诉那样不好,所以我用了while。或者我用readline()是一种错误,该用readbyte(),将他们放到一个数组,真的糊涂了,希望各位朋友帮忙解答。
{
}
}另为什么不用 srial port 的 Event
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
自动触发!
}
#region serialPort_ErrorReceived
private void serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
MessageBox.Show(e.ToString(), "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Error); }
#endregion
{
//这个好使
while (port1.BytesToRead>0)
{
int data = Convert.ToInt32(port1.ReadLine());
string abc = Convert.ToString(data);
WriteFile(abc);
}
}
我不理解的是为什么说用timer不好?Sleep也差不多的
利用System.Threading.Timer实现多线程
如果想定时保存,那就加timer控件。 此功能建议楼主不要使用线程来操作。
private void selMonitor_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
this.txtInceptValues.Text = "";保存接收的值。
for (int count = 0; count < selMonitor.BytesToRead; count++)
{
byte[] singlebyte ={ (byte)this.selMonitor.ReadByte()};
string temp = BitConverter.ToString(singlebyte);
this.txtInceptValues.Text = this.txtInceptValues.Text + temp;
}
在此做处理或是保存数据。
}
catch
{
}
}