C# serialport内datareceived事件接收串口数据,详细步骤。

我是新手,刚接触C#。请各位大神详细说明一下,在网上查找的资料越看越晕。请您详细讲解委托、以及在界面更新接收后的数据那里。
private delegate void MyDelegate(string str);
private void DisplayData(string str)
{
MessageBox.Show("5");
textBox2.Text=str;
MessageBox.Show("6");
listBox1.Items.Add(str);
MessageBox.Show("7");
}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
MessageBox.Show("1");
byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
MessageBox.Show("2");
string str = Encoding.Unicode.GetString(data);
MessageBox.Show("3");
MyDelegate md = new MyDelegate(DisplayData);
MessageBox.Show("4");
this.BeginInvoke(md, new object[] { str});
MessageBox.Show("8");
//DisplayData(str);

//Thread.sleep(1000);//处理事件这块可以加上延时确保不定数的数据可以全部收到缓冲后,才去读缓冲内容--单位:毫秒

byte[] data = new byte[serialPort1.BytesToRead]; //定义缓冲区,因为串口事件触发时有可能收到不止一个字节

serialPort1.Read(data, 0, data.Length);//读取指定长度

foreach (byte Member in data) //遍历用法

{

string str = Convert.ToString(Member, 16).ToUpper();

textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");

}

读取有的string InputData = serialPort1.ReadExisting();

单字节读取(当波特率高时就会丢失数据)

byte DataReceived = (byte)(serialPort1.ReadByte());                      

扩展资料:

衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。

如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

参考资料来源:百度百科-串口通信

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-06

由于串口在不断的接收数据,DataReceived事件在不断的触发,所以数据处理放到委托里面,DataReceived只做数据接收,假如你把数据处理放在DataReceived事件中,可能会影响到数据的接收。

如果你对委托不太了解,可以查阅MSDN文档:http://msdn.microsoft.com/zh-cn/library/ms173171.aspx

另外,调试的话最好不要用MessageBox,用MessageBox后需要点击确定才能执行下面的代码,影响程序的执行。

用Console.WriteLine(text),在输出的调试列表即可看到信息。

如有疑问,继续追问。

追问

请问如何显示在界面的listbox或者textbox中?晕乎乎的。还有,方便加Q Q吗?多向您请教请教。

追答

你的委托方法就是将数据添加到listBox1

调用了该委托就可以了。

追问

private void DisplayData(string str)
{
textBox2.Text=str;
listBox1.Items.Add(str);
}
对吗?刚接触这个,真心求教。

追答

对的
DataReceived中MessageBox都去掉,假如接收到数据会有显示的。

追问

但是我的程序里没有反映啊,我用的是sscom32的调试软件发送的数据。

追答

你用的是ReadLine(),所以发生数据的时候需要发生回车,不然串口一直处于读取状态,等待回车字符。

另外我用你的代码测试过了,可以接收数据。
ps:记得打开串口,serialPort1.Open();

追问

我做的button控件,已经打开了,但是数据没有显示在listbox和textbox里面。
ps:刚接触c#编程不到1个月。很多基础只是掌握不是很牢靠。望您能指正。

追答

sscom32的调试软件需要发生回车(你用的ReadLine方法),不然串口一直在读,直到读到回车才会运行下面的程序。

本回答被提问者采纳
相似回答