C# Winform 基于SerialPort类实现串口通信,ASCII数据收发(打开、关闭、接收、发送)
1.C# 使用TIBCO中间件通信:发送、接收。
2.C# Winform 基于SerialPort类实现串口通信,ASCII数据收发(打开、关闭、接收、发送)
C# Winform 基于SerialPort类实现串口通信
效果展示
UI界面代码
public partial class Frm_SerialPortTest : Form { SerialPort mySerialPort; public Frm_SerialPortTest() { InitializeComponent(); this.MinimumSize = new System.Drawing.Size(650, 500); this.CenterToScreen(); } /// <summary> /// 窗体加载事件 /// </summary> private void Frm_SerialPortTest_Load(object sender, EventArgs e) { // // 获取本机存在的所有 COM 口 cbx_SerialPort.DataSource = SerialPortTest.PortArray(); //波特率 cbx_BaudRate.DataSource = SerialPortTest.BaudRateArray(); cbx_BaudRate.SelectedIndex = cbx_BaudRate.Items.Count - 1; //校验位 cbx_Parity.DataSource = SerialPortTest.ParityArray(); //数据位 cbx_DataBit.DataSource = SerialPortTest.DataBitArray(); //停止位, cbx_StopBit.DataSource = SerialPortTest.StopBitArray(); cbx_StopBit.SelectedIndex = 1; btn_Open.Enabled = true; btn_Close.Enabled = false; } #region 按钮事件 /// <summary> /// 打开按钮事件 /// </summary> private void btn_Open_Click(object sender, EventArgs e) { try { mySerialPort = new SerialPort(cbx_SerialPort.Text); // 选择正确的串口号 mySerialPort.BaudRate = int.Parse(cbx_BaudRate.Text); mySerialPort.Parity = (Parity)Enum.Parse(typeof(Parity), cbx_Parity.Text); mySerialPort.DataBits = int.Parse(cbx_DataBit.Text); mySerialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cbx_StopBit.Text); mySerialPort.Handshake = Handshake.None; mySerialPort.RtsEnable = checkBox_RtsEnable.Checked; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); mySerialPort.Open(); picBx_StatusShow.BackColor = Color.LimeGreen; MessageShow("打开串口成功!"); MessageShow($"port = {mySerialPort.PortName},Parity = {mySerialPort.Parity},DataBits = {mySerialPort.DataBits},stopBits = {mySerialPort.StopBits}"); ParamControlUpdata(gpbx_SetParam, false); btn_Open.Enabled = false; btn_Close.Enabled = true; } catch (Exception ex) { picBx_StatusShow.BackColor = Color.Gray; MessageShow(ex.Message); ParamControlUpdata(gpbx_SetParam, true); btn_Open.Enabled = true; btn_Close.Enabled = false; } } /// <summary> /// 关闭按钮事件 /// </summary> private void btn_Close_Click(object sender, EventArgs e) { try { if (mySerialPort == null) { picBx_StatusShow.BackColor = Color.Gray; } else { picBx_StatusShow.BackColor = Color.Gray; MessageShow("关闭串口成功!"); MessageShow($"port = {mySerialPort.PortName},Parity = {mySerialPort.Parity},DataBits = {mySerialPort.DataBits},stopBits = {mySerialPort.StopBits}"); mySerialPort.Close(); mySerialPort = null; } ParamControlUpdata(gpbx_SetParam, true); btn_Open.Enabled = true; btn_Close.Enabled = false; } catch (Exception ex) { ParamControlUpdata(gpbx_SetParam, true); btn_Open.Enabled = true; btn_Close.Enabled = false; } } /// <summary> ///发送按钮 /// </summary> private void btn_SendData_Click(object sender, EventArgs e) { if (mySerialPort == null) return; string data = rtbx_SendData.Text; mySerialPort.Write(data); } /// <summary> /// 清空接收框 /// </summary> private void btn_ClearReceiveData_Click(object sender, EventArgs e) { rtbx_ReceivedData.Text = string.Empty; } // <summary> /// 清空发送框 /// </summary> private void btn_ClearSendData_Click(object sender, EventArgs e) { rtbx_SendData.Text = string.Empty; } #endregion #region 委托方法 /// <summary> /// 数据接收委托 /// </summary> private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); MessageShow(indata); } #endregion #region 其他方法 /// <summary> /// 消息显示 /// </summary> public void MessageShow(string data) { rtbx_ReceivedData.Invoke(new Action(() => { rtbx_ReceivedData.AppendText($"{DateTime.Now}】{data}{Environment.NewLine}"); })); } /// <summary> /// 更新指定控件的Enabled /// </summary> public void ParamControlUpdata(Control control, bool statu) { foreach (Control childControl in control.Controls) { if (childControl is ComboBox) { (childControl as ComboBox).Enabled = statu; } // 如果子控件是容器控件,则递归遍历其子控件 if (childControl.HasChildren) { ParamControlUpdata(childControl, statu); } } } #endregion }
其他辅助类代码
public class SerialPortTest { public static int[] _BaudRateArray = { 110,300, 600, 1200, 2400, 4800, 9600, 14400,19200, 38400, 57600, 115200 }; public static int[] _DataBitArray = { 8,7,6,5 }; /// <summary> /// 串口号 /// </summary> public string Port = "COM1"; /// <summary> /// 波特率 /// </summary> public int BaudRate = 115200; /// <summary> /// 校验位(奇偶性) /// </summary> public Parity Parity = Parity.None; /// <summary> /// 数据位 /// </summary> public int DataBit = 8; /// <summary> /// 停止位 /// </summary> public StopBits StopBit = StopBits.One; /// <summary> /// 握手方式 /// </summary> public Handshake Handshake = Handshake.None; /// <summary> /// 复位使能 /// </summary> public bool RtsEnable = true; public SerialPortTest() { } public SerialPortTest(string port,int baudRate, Parity parity, int dataBit, StopBits stopBit) { this.Port = port; this.BaudRate = baudRate; this.Parity = parity; this.DataBit = dataBit; this.StopBit = stopBit; } public void SetPortParam(string port, int baudRate, Parity parity, int dataBit, StopBits stopBit) { this.Port = port; this.BaudRate = baudRate; this.Parity = parity; this.DataBit = dataBit; this.StopBit = stopBit; } #region 静态方法 public static Array PortArray() { return SerialPort.GetPortNames(); } public static Array BaudRateArray() { return _BaudRateArray; } public static Array DataBitArray() { return _DataBitArray; } public static Array ParityArray() { return Enum.GetValues(typeof(Parity)); } public static Array StopBitArray() { return Enum.GetValues(typeof(StopBits)); ; } #endregion }
(本人)原文连接: http://t.csdnimg.cn/5Cne1
本文来自博客园,作者:吾与谁归,转载请注明原文链接:https://www.cnblogs.com/whojie/articles/18358242
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~