唉,又是串口和线程。
是这样的:
WinForm程序。
用线程来扫描串口。
创建一个线程,当串口有数据时,线程执行,来处理串口中的数据。然后线程停止。
当串口又接受到数据时,线程继续执行,来处理串口中的数据。
处理串口数据的方法是个死循环,一直在执行。
private void Form1_Load(object sender,EventArgs)
{
//设置串口和波特率
} public void testMain() //处理串口数据的方法
{
while(true)
{
//处理串口数据
}
//线程停止
} private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
//获取串口数据
//线程执行
}
问题:大体思路是这样的,现在我不太清楚,线程该创建在什么地方,该如何控制才能完成以上的功能?
是这样的:
WinForm程序。
用线程来扫描串口。
创建一个线程,当串口有数据时,线程执行,来处理串口中的数据。然后线程停止。
当串口又接受到数据时,线程继续执行,来处理串口中的数据。
处理串口数据的方法是个死循环,一直在执行。
private void Form1_Load(object sender,EventArgs)
{
//设置串口和波特率
} public void testMain() //处理串口数据的方法
{
while(true)
{
//处理串口数据
}
//线程停止
} private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
//获取串口数据
//线程执行
}
问题:大体思路是这样的,现在我不太清楚,线程该创建在什么地方,该如何控制才能完成以上的功能?
PC机的数据处理能力远大于串口一次性传过来的数据量,别把事情想复杂了.如果你坚持用线程,也无需来一次数据开一个线程,而是在serialPort1_DataReceived事件中
将收到的数据放入缓存,有一个已经开好的线程不停从缓存中拿数据处理,有数据则处理,无数据则Sleep.
跨执行绪作业无效,存取控制项richTextBox时所使用的执行绪与建立控制项的执行绪不同。
(我在richTextBox中显示处理串口数据的一些信息)
DataReceived其实是另外一个线程,在另一个线程直接操作UI线程创建的控件是不允许的,做一个Invoke操作.
RichTextBox rtb = new RichTextBox();
string msg = "hello world";
this.Invoke(new Action(() => { rtb.AppendText(msg); }));
DataReceived中访问ui需要调用Invoke
例如
this.Invoke((EventHandler)delegate
{
//访问ui资源的代码
});
SerialPort serialPort = null; private void Form1_Load(object sender,EventArgs)
{
//设置串口和波特率
if(object.equals(serialPort, null))
{
serialPort = new SerialPort();
}
} public void testMain() //处理串口数据的方法
{
while(true)
{
//处理串口数据
}
//线程停止
} private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
int _length = serialPort1.BytesToRead;
byte[] _byte = new byte[_length];
int _intResult = serialPort1.Read(_byte, 0x00, _length);
string serialData = System.Text.Encoding.Default.GetString(_byte);
this.Invoke(new Action(() => { serialData}));
}
你要是仍然不明白的话 就联系下我 我给你再介绍下