1.从工具拦拖动一个SerialPort控件,在窗体下面会多出一个serialPort1的图标html
2.在serialPort1属性的事件(黄色闪电图标)里有个DataReceived事件数组
3.双击DataReceived事件,写收到的数据的处理代码,端口打开后若是有数据来,就触发DataReceived事体 须要注意的是串用自已的这个事件自已开了一个线程,若是要修改原来窗体的控件属性要用到委托缓存
//窗体初始化 private void SerialportSampleForm_Load(object sender, EventArgs e) { //初始化下拉串口名称列表框 string[] ports = SerialPort.GetPortNames(); Array.Sort(ports); comboPortName.Items.AddRange(ports); comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1; comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600"); //初始化SerialPort对象 comm.NewLine = "/r/n"; comm.RtsEnable = true;//根据实际状况吧。 //添加事件注册 comm.DataReceived += comm_DataReceived; } void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (isClosing) return;//若是正在关闭,忽略操做,直接返回,尽快的完成串口监听线程的一次循环 try { Listening = true;//设置标记,说明我已经开始处理数据,一下子要使用系统UI的。 int n = comm.BytesToRead;//先记录下来,避免某种缘由,人为的缘由,操做几回之间时间长,缓存不一致 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 received_count += n;//增长接收计数 comm.Read(buf, 0, n);//读取缓冲数据 builder.Clear();//清除字符串构造器的内容 //由于要访问ui资源,因此须要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是不是显示为16禁止 if (checkBoxHexView.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 this.txGet.AppendText(builder.ToString()); //修改接收计数 labelGetCount.Text = "Get:" + received_count.ToString(); })); } finally { Listening = false;//我用完了,ui能够关闭串口了。 } }