串口通信在工业领域用得比较多,说实在的这种技术是非常落后的。因为它不可靠,相信使用过它的人都知道为什么,这里就不多说了。虽然不可靠,但它还是经常被使用,C#的串口通信你会吗?一起来学习下吧。
这个程序有点花哨,其实主要的代码就一点,逻辑判断什么的自己写吧,核心代码如下。
首先实例化串口对象与注册串口接收事件。这一部分可以通过串口控件使用vs的设置界面设置,无需代码,当然使用代码也是可以的。
复制
Mydata.mserialprot = new SerialPort(); Mydata.mserialprot.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
串口信息初始化
复制
/// <summary> /// 串口初始化设置 /// </summary> public void InitializeSerialSet() { InitializePorts(); // 初始化串口号 // 初始化波特率 comboBox_BandRate.Text = comboBox_BandRate.Items[0].ToString(); // 初始化校验位 comboBox_Check.Text = comboBox_Check.Items[0].ToString(); // 初始化数据位 comboBox_Data.Text = comboBox_Data.Items[3].ToString(); // 初始化停止位 comboBox_Stop.Text = comboBox_Stop.Items[0].ToString(); } /// <summary> /// 可用串口扫描,并且显示 /// </summary> public void InitializePorts() { comboBox_Serial.Items.Clear(); // 清空原来的信息 // 返回可用串口号,形式:COM3 string[] arraysPostsNames = SerialPort.GetPortNames(); // 获取所有可用的串口号 // 检查串口号是否正确 if (arraysPostsNames.Length > 0) { Array.Sort(arraysPostsNames); // 使用默认进行排序,从小到大肾虚 for (int i = 0; i < arraysPostsNames.Length; i++) { comboBox_Serial.Items.Add(arraysPostsNames[i]); // 将所有可用串口加载到串口显示框当中 } comboBox_Serial.Text = arraysPostsNames[0]; // 默认选择第一个串口 comboBox_Serial.Enabled = true; // 打开选择框 } else { comboBox_Serial.Text = "None"; // 提示没有可用串口 comboBox_Serial.Enabled = false; // 禁止打开串口选择框 } }
打开串口
复制
private void btOpenCom_Click(object sender, EventArgs e) { if (Mydata.mserialprot == null) { return; } if (Mydata.mserialprot.IsOpen == false) { Mydata.mserialprot.PortName = comboBox_Serial.Text; Mydata.mserialprot.BaudRate = Convert.ToInt32(comboBox_BandRate.Text); Mydata.mserialprot.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_Check.Text); // 强制类型转换 Mydata.mserialprot.DataBits = Convert.ToInt32(comboBox_Data.Text); Mydata.mserialprot.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox_Stop.Text); Mydata.mserialprot.WriteTimeout = 300; Mydata.mserialprot.ReadTimeout = 300; Mydata.mserialprot.ReceivedBytesThreshold = 1; try { Mydata.mserialprot.Open(); // 设置按键的使用权限 comboBox_Serial.Enabled = false; comboBox_BandRate.Enabled = false; comboBox_Check.Enabled = false; comboBox_Data.Enabled = false; comboBox_Stop.Enabled = false; btOpenCom.Text = "关闭串口"; } catch (Exception) { MessageBox.Show("串口连接失败!\r\n可能原因:串口被占用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { Mydata.mserialprot.Close(); // 关闭串口 // 设置按键的使用权限 comboBox_Serial.Enabled = true; comboBox_BandRate.Enabled = true; comboBox_Check.Enabled = true; comboBox_Data.Enabled = true; comboBox_Stop.Enabled = true; btOpenCom.Text = "打开串口"; } }
接收串口数据
复制
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件 { Thread.Sleep(60); try { string recvContent = null;//用来存放接收到的内容 byte[] data = new byte[Mydata.mserialprot.BytesToRead]; //申请存放数据的缓冲区 Mydata.mserialprot.Read(data, 0, Mydata.mserialprot.BytesToRead);//读取数据到data中 Mydata.mserialprot.DiscardInBuffer(); recvContent += new ASCIIEncoding().GetString(data);//将接收到的内容追加到接收区 //使用Invoke访问主线程创建的控件 this.Invoke((EventHandler)(delegate { MessageBox.Show(recvContent); })); } catch { } }
串口发送数据
复制
/// <summary> /// 向串口中发送数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public bool SendData(byte[] data) { if (Mydata.mserialprot == null) { return false; } if (Mydata.mserialprot.IsOpen == false) { return false; } try { Mydata.mserialprot.Write(data, 0, data.Length); } catch (Exception) { //提示信息 MessageBox.Show("数据发送失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } return true; }
发送数据使用代码
复制
if (Mydata.mserialprot == null) { return; } if (Mydata.mserialprot.IsOpen == true) { string senddata = textBox1.Text; byte[] data = System.Text.Encoding.Default.GetBytes(senddata); // 将发送的数据转化为字节数组 SendData(data); // 发送数据 }
整个实现过程分为三步,也就是三个代码段。
- 初始化并打开串口、注册串口接收数据事件。
- 接收数据实现。
- 发送数据实现。
就这么简单,上面我是以字符的形式发送接收的,如果你需要十六进制,自己转换就行了。
评论 (7)