Close串口后再重新Open串口,报出“对端口的访问被拒绝”,这显然是之前关串口没有关掉,重复打开了,为什么会这样?

Frog1228 2013-03-11 04:33:28
在软件中,在串口的Data_Received事件中若发生了异常,将相应操作杆线程关闭,关掉串口,再重新打开串口,再重新打开。在打开串口的时候会报异常“对端口的访问被拒绝”。这显然是之前关串口没有关掉,重复打开了,为什么会这样?

private void CloseJoystickerRightport()
{
try
{
while (JoystickerLexium23dPort.IsOpen)
{
joyStickRightPortKeepReading = false;
JoystickerLexium23dPort.DataReceived -= new SerialDataReceivedEventHandler(JoystickerRightport_DataReceived);
JoystickerLexium23dPort.DiscardOutBuffer();
JoystickerLexium23dPort.DiscardInBuffer();
JoystickerLexium23dPort.Close();
}
}
catch (System.Exception ex)
{
writeExceptionToLogFile("CloseXYZJoystickRightport", ex.Message);
}
}
private void OpenJoystickRightPot()
{
try
{
//if (JoystickerLexium23dPort.IsOpen)
//{
while (JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Close();
if (!JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Open();
//}
//else
//{
// JoystickerLexium23dPort.Open();
//}
JoystickerLexium23dPort.DiscardOutBuffer();
JoystickerLexium23dPort.DiscardInBuffer();
JoystickerLexium23dPort.WriteTimeout = 100;
JoystickerLexium23dPort.ReadTimeout = 100; //**操作杆一发送命令,即使没有动操作杆,也会返回值 //MJ
JoystickerLexium23dPort.DataReceived += new SerialDataReceivedEventHandler(JoystickerRightport_DataReceived);
}
}
catch(Exception ex)
{
writeExceptionToLogFile("OpenXYZJoystickRightport", ex.Message);
}
...全文
3478 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
a1988lourong 2014-10-27
  • 打赏
  • 举报
回复
w7210982 能给贴个结束读取线程的代码吗
maxin_td 2014-08-01
  • 打赏
  • 举报
回复
修改方法: 1、将工程的目标框架设置为:.net framework 4 2、可同时升级到.net framework 4.5
w7210982 2014-08-01
  • 打赏
  • 举报
回复
再关闭一次就好了,我刚才也遇到这个问题,我是在线程里面读串口的,关闭时不报任何错误,但就是打不开,说访问拒绝,我后来修改了下关闭,先关闭串口--------结束读取线程---------再关闭串口,这样一次就可以重新打开串口了。
ConquerW 2014-07-22
  • 打赏
  • 举报
回复
我也遇到这种情况怎么办 求解!!!!!
dodidi123 2013-06-06
  • 打赏
  • 举报
回复
我也有这个问题怎么解决?
Frog1228 2013-03-14
  • 打赏
  • 举报
回复
引用 13 楼 mjp1234airen4385 的回复:
看看,你的代码是不是放在线程了执行了,线程没有关闭,也会这样的。
关掉串口,再重新打开串口是放到串口的Data_Received事件的异常捕获中的,关闭串口的代码中 joyStickRightPortKeepReading = false; 是停止操作杆的线程,它是一个不断循环向串口发送命令,得到返回信息,来知道操作杆的移动情况。这边应该是有问题的,因为关闭串口的时候,线程有可能还没结束掉。
leafmao 2013-03-12
  • 打赏
  • 举报
回复
顺便问下,断点调试的话,有没有执行到JoystickerLexium23dPort.Close();?
leafmao 2013-03-12
  • 打赏
  • 举报
回复
为什么LZ老是遇到奇怪的问题。。。断点调试找问题啊 我用这两句测试了下,怎么没遇到问题的。。。。 while (JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Close(); if (!JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Open(); 怀疑LZ的端口8被其他程序占用,或者在本程序中别的SerialPort控件占用,但这个控件不叫JoystickerLexium23dPort。检查下程序里有没有别的串口控件
三五月儿 2013-03-12
  • 打赏
  • 举报
回复
异常处理中也应该做关闭操作
Frog1228 2013-03-12
  • 打赏
  • 举报
回复
没人回。。。
mjp1234airen4385 2013-03-12
  • 打赏
  • 举报
回复
看看,你的代码是不是放在线程了执行了,线程没有关闭,也会这样的。
leafmao 2013-03-12
  • 打赏
  • 举报
回复
引用 11 楼 mjjackey 的回复:
引用 10 楼 leafmao 的回复:顺便问下,断点调试的话,有没有执行到JoystickerLexium23dPort.Close();? 平时调用这两个关闭和打开串口函数没有问题。 串口的Data_Received事件中若发生了异常执行相应操作“将相应操作杆线程关闭,关掉串口,再重新打开串口,重新再打开操作杆线程”时会出现“对端口的访问被拒绝”,很偶尔才出现一次……
可是你并没有在catch块中关闭串口呀。。。 你说的在串口的Data_Received事件中若发生了异常执行关闭操作,但是你的异常处理里并没有执行关闭操作啊 而且你贴的程序中都没有Data_Received事件的处理代码
Frog1228 2013-03-12
  • 打赏
  • 举报
回复
引用 10 楼 leafmao 的回复:
顺便问下,断点调试的话,有没有执行到JoystickerLexium23dPort.Close();?
平时调用这两个关闭和打开串口函数没有问题。 串口的Data_Received事件中若发生了异常执行相应操作“将相应操作杆线程关闭,关掉串口,再重新打开串口,重新再打开操作杆线程”时会出现“对端口的访问被拒绝”,很偶尔才出现一次。 不可能有其它软件,程序,地方占着了这个口。
Frog1228 2013-03-11
  • 打赏
  • 举报
回复
引用 5 楼 lye2000000_super 的回复:
private void OpenJoystickRightPot() { try { //if (JoystickerLexium23dPort.IsOpen) //{ while (JoystickerLexium……
这个异常里关掉再开? 为什么前面关掉了,没成功?
  • 打赏
  • 举报
回复
private void OpenJoystickRightPot() { try { //if (JoystickerLexium23dPort.IsOpen) //{ while (JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Close(); if (!JoystickerLexium23dPort.IsOpen) JoystickerLexium23dPort.Open(); //} //else //{ // JoystickerLexium23dPort.Open(); //} JoystickerLexium23dPort.DiscardOutBuffer(); JoystickerLexium23dPort.DiscardInBuffer(); JoystickerLexium23dPort.WriteTimeout = 100; JoystickerLexium23dPort.ReadTimeout = 100; //**操作杆一发送命令,即使没有动操作杆,也会返回值 //MJ JoystickerLexium23dPort.DataReceived += new SerialDataReceivedEventHandler(JoystickerRightport_DataReceived); } } catch(Exception ex) { writeExceptionToLogFile("OpenXYZJoystickRightport", ex.Message); } 这里异常里关掉串口。。。
Frog1228 2013-03-11
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
关闭进异常了吗?你看看日志里写的什么错误信息
关闭的时候没进异常,打开串口的时候报异常了:“对端口“COM8”的访问被拒绝。”一开始提的。
  • 打赏
  • 举报
回复
你出异常的时候没有关闭串口吧。 异常里就得去关。你代码里没看到去关。
leafmao 2013-03-11
  • 打赏
  • 举报
回复
检查下有没有别的程序在占用相应的串口
gxingmin 2013-03-11
  • 打赏
  • 举报
回复
关闭进异常了吗?你看看日志里写的什么错误信息

111,131

社区成员

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

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

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