wpf 串口通信 数据不定时接收

xiaoniqiumm 2015-07-27 02:46:45
应用wpf做了个小软件,可以管理设备的信息。串口不定时接收到数据,在接收数据时怎样不影响软件的使用,后台直接处理数据,写了下面的程序,鼠标点击允许通信后如果没有执行其他任务可以接收到数据,但是只要鼠标点击软件中的别的选项后,就不能再接收到数据了,怎样才能持续等待串口发来的数据,不管此时软件在做什么都能不受干预的执行该任务。是需要触发器么?还是多线程?最好提供个例程可以参考下,多谢了!

private void Button_Click_14(object sender, RoutedEventArgs e)
{
try
{
if (!serialport1.IsOpen)
{

openclose.Content = "允许读卡器通信";
}
else
{
serialport1.Close();
openclose.Content = "禁止读卡器通信";
return;
}
serialport1.PortName = "COM1";
serialport1.BaudRate = 9600;
serialport1.Parity = Parity.None;
serialport1.StopBits = StopBits.One;
serialport1.Open();
serialport1.ReceivedBytesThreshold = 4;
serialport1.DataReceived += new SerialDataReceivedEventHandler(serialport1_DataReceived);
//flag = true;
}
catch
{
MessageBox.Show("打开串口失败,请重试!");
//处理超时错误
}

}
public void serialport1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort Port = (SerialPort)sender;
int SeriaDataLength = Port.BytesToRead; //得到缓冲区数据长度
byte[] SeriaData = new byte[SeriaDataLength]; //设置数组
Port.Read(SeriaData, 0, SeriaDataLength); //读取缓冲区
interfaceUpdateHandle = new HandleInterfaceUpdateDelagate(UpdateTextBox);//实例化委托对象
Dispatcher.Invoke(interfaceUpdateHandle, new string[] { Encoding.ASCII.GetString(SeriaData) });

}
private void UpdateTextBox(string text)
{
////////////////////////////////////////////////////////////////////////
//<协议解析>
List<string> buf = new List<string>(text.Length);//声明一个临时数组存储当前来的串口数据
MessageBox.Show(text.Length.ToString());
MessageBox.Show(text);
for (int i = 0; i < text.Length / 2; i++)
{
buf.Add(text.Substring(i * 2, 2));
}
while (text.Length >= 5) //至少要包含头(2字节)+命令(1字节)+数据长度(1字节)+校验(1字节)
{
if (buf[0] == "aa" && buf[1] == "01")
{
if (buf[2] == "01")//归还设备
{
string device = text.Substring(6, 8);
sqlHelper.comreturn(device);
MessageBox.Show("设备已归还");
}
else if (buf[2] == "02")
{
string device = text.Substring(6, 8);
}
}
else
{
buf.RemoveAt(0);
}
}
...全文
345 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
1987andy 2015-07-27
  • 打赏
  • 举报
回复
既然要持续的接受来自串口的数据,最简单的做法肯定是要使用到线程,一个专门用来接收监听串口并接受数据的线程了,如果数据需要呈现到界面,那么就要考虑使用dispatch,的invoke或者beginInvoke方法了,不过这里需要注意的就是调用的主体(也就是上下文)避免堵塞了主线程造成界面卡的情况。 至于你说,你开了线程后台处理了,然后你点主界面既然会出现数据断收的情况,我表示这种情况没遇到,也很奇怪~
exception92 2015-07-27
  • 打赏
  • 举报
回复
msdn WPF Dispatcher

110,501

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧