serialPort端口被占用问题

master_master 2018-05-15 04:07:58
想做一个软件,用PC连接多个串口,我用tabControl实现了页面布局,如图



当我点击连接串口,断开串口后,再进行连接串口,发现串口被占用,无法再进行连接

之后找了半天,定位到问题是:连接和断开都进行了: SerialPort comm = new SerialPort();这个操作

现在不知道怎么解决这个问题,有人能帮帮我吗
...全文
752 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzone12345 2018-05-15
  • 打赏
  • 举报
回复
先搜一下有多少可以用的串口
master_master 2018-05-15
  • 打赏
  • 举报
回复
引用 10 楼 lqh18758471530 的回复:
可以尝试将SerialPort放入标签页中的Tag中,需要使用时提取当前标签页中Tag Tag中存放的是object类型的
很有用,谢谢这位大兄弟,一直以为tag只是一个标签的作用,没想到还有这么大的作用
master_master 2018-05-15
  • 打赏
  • 举报
回复
问题已经解决啦,谢谢大家
xuzuning 2018-05-15
  • 打赏
  • 举报
回复
什么叫 在使用中又添加了新的串口设备 ??? 你怎么加的?你又怎么知道又加了
大鱼> 2018-05-15
  • 打赏
  • 举报
回复
串口连接时候是需要指定串口名称的,不管你连接多少个串口名称都是不一样的,找到对应的串口名称是不会存在端口被占用的情况的
帅麒麒 2018-05-15
  • 打赏
  • 举报
回复
可以尝试将SerialPort放入标签页中的Tag中,需要使用时提取当前标签页中Tag Tag中存放的是object类型的
master_master 2018-05-15
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
SerialPort.GetPortNames() 不是可以取到所有串口的名字吗?
刚进入程序时已经读到了,可能在使用中又添加了新的串口设备,所以我加了一个添加按钮
xuzuning 2018-05-15
  • 打赏
  • 举报
回复
// // 摘要: // 获取当前计算机的串行端口名称数组。 // // 返回结果: // 当前计算机的串行端口名称数组。 // // 异常: // System.ComponentModel.Win32Exception: // 未能查询串行端口名称。 public static string[] GetPortNames();
xuzuning 2018-05-15
  • 打赏
  • 举报
回复
SerialPort.GetPortNames() 不是可以取到所有串口的名字吗?
master_master 2018-05-15
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
有多少个串口设备,才能实例化多少个 serialPort 不能随心所欲,要管住自己
现在是不确定有多少个串口设备,有可能这时候只有两台,下次就可能3台5台啦
master_master 2018-05-15
  • 打赏
  • 举报
回复
引用 3 楼 lyq8376 的回复:
[quote=引用 2 楼 master_master 的回复:] 不好设置全局变量,每个标签页都要用到这个变量,标签页个数还不确定
看你的截图不是只有三个标签页吗?[/quote] 底下还有添加按钮,还可以加很多很多
  • 打赏
  • 举报
回复
引用 2 楼 master_master 的回复:
不好设置全局变量,每个标签页都要用到这个变量,标签页个数还不确定
看你的截图不是只有三个标签页吗?
master_master 2018-05-15
  • 打赏
  • 举报
回复
引用 1 楼 lyq8376 的回复:
可以定义一个全局的SerialPort变量,连接和断开的时候都对这个变量进行操作
不好设置全局变量,每个标签页都要用到这个变量,标签页个数还不确定
xuzuning 2018-05-15
  • 打赏
  • 举报
回复
有多少个串口设备,才能实例化多少个 serialPort 不能随心所欲,要管住自己
  • 打赏
  • 举报
回复
可以定义一个全局的SerialPort变量,连接和断开的时候都对这个变量进行操作
namespace 串口实例 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnSend_Click(object sender, EventArgs e) { //手动发送 SendMsg(); } private void SendMsg() { this.serialPort1.Write(this.txtSend.Text); } #region 控制输入数字 private void ComboBox_TextUpdate(object sender, EventArgs e) { ComboBox cbo = sender as ComboBox; int n; if (!int.TryParse(cbo.Text, out n)) { cbo.Text = cbo.Text.Substring(0, cbo.Text.Length - 1); } else { if (n <= 0) { cbo.Text = cbo.Text.Substring(0, cbo.Text.Length - 1); } } } private void txtTime_TextChanged(object sender, EventArgs e) { TextBox text = sender as TextBox; int n; if (!int.TryParse(text.Text, out n)) { text.Text = text.Text.Substring(0, text.Text.Length - 1); } else { if (n <= 0) { text.Text = text.Text.Substring(0, text.Text.Length - 1); } else { this.timer1.Interval = n; } } } #endregion /// /// 清空显示文本框 /// /// /// private void btnClear_Click(object sender, EventArgs e) { this.txtRecive.Clear(); } private void timer1_Tick(object sender, EventArgs e) { SendMsg(); } private void cbtSend_CheckedChanged(object sender, EventArgs e) { CheckBox check = sender as CheckBox; if (check.Checked) { this.timer1.Start(); } else { this.timer1.Stop(); } } /// /// 接收返回的数据 /// /// /// private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string a=""; if (this.cbkShow16.Checked) { //十六进制显示 a = this.serialPort1.ReadExisting(); } else { //字符串显示 byte[] by = new byte[this.serialPort1.BytesToRead]; this.serialPort1.Read(by, 0, this.serialPort1.BytesToRead); a = Encoding.ASCII.GetString(by); } this.txtRecive.AppendText(a); this.txtRecive.ScrollToCaret(); } private void Form1_Load(object sender, EventArgs e) { //加载 this.serialPort1.RtsEnable = true; button1_Click(this.btnOpen, null); } private void button1_Click(object sender, EventArgs e) { Button btn = sender as Button; if (btn.Text == "打开端口") { try { this.serialPort1.PortName = this.cboPortName.Text; this.serialPort1.BaudRate = Convert.ToInt32(this.cboRaudRate.Text); this.serialPort1.DataBits = Convert.ToInt32(this.cboDataBits.Text); this.serialPort1.ReceivedBytesThreshold = Convert.ToInt32(this.cboReceivedBytesThreshold.Text); this.serialPort1.Open(); btn.Text = "关闭端口"; } catch { MessageBox.Show("打开端口失败,请检查端口是否被占用."); } } else { this.serialPort1.Close(); btn.Text = "打开端口"; } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { this.serialPort1.Close(); } catch { } } } }

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧