我是新手,刚接触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位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
参考资料来源:百度百科-串口通信
由于串口在不断的接收数据,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方法),不然串口一直在读,直到读到回车才会运行下面的程序。
本回答被提问者采纳