首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

vb.net怎么关闭其他窗体的串口,救救小弟我把,软件都快编好了,就差最后一个毛病了

2012-03-16 
vb.net如何关闭其他窗体的串口,救救我把,软件都快编好了,就差最后一个毛病了我的父窗体上有一个serialport

vb.net如何关闭其他窗体的串口,救救我把,软件都快编好了,就差最后一个毛病了
我的父窗体上有一个serialport,打开这个(用来接收数据),然后子窗体打开的时候要用到一个serialport,我把它写在模块里面的说,但是当药用的时候就出现父窗体上的串口关闭不了的情况,于是就出错了,是不是再什么地方有技巧的啊?还有用来接收数据的串口能不能写到模块里面去的呀?要怎么写的说???
下面是我的代码
main父窗体load的时候
SerialPort1.PortName = "com1"
  SerialPort1.Open()
然后子窗体一个按钮点击的时候
 main.SerialPort1.Close()



  Call sp_cmd(add_code, data_code, qu & lie)‘这个就是写到模块的串口发送程序
模块里面的程序
Dim sp As New IO.Ports.SerialPort
  Dim str_head As String
  Dim i As Integer
  Dim byts_cmd(30) As Byte

  'Dim str_qulie As String
  sp.PortName = "com1"
  sp.BaudRate = 9600
  sp.Parity = IO.Ports.Parity.None
  sp.DataBits = 8
  sp.StopBits = IO.Ports.StopBits.One
  If sp.IsOpen = True Then
  sp.Close()

  End If
  sp.Open()
。。。。。
到open的时候就出错了:
未处理 System.UnauthorizedAccessException
  Message="对端口“com1”的访问被拒绝。"
我研究了下,把main_load里面的串口关闭就能通过的说
但是在其他窗体里面用main.sertalport.close()是关闭不了的
监视变量里面说对非共享成员的引用要求对象引用
大家帮帮我把
 

[解决办法]
Dim sp As New IO.Ports.SerialPort 

把这个,也就是定义串口的语句放到模块里,定义成public,让两个窗体共用这个串口
试试看
[解决办法]
那你干么不在弹出第二个窗口前关掉呢呵~~这也是个办法
Dim B as new Form2
B.show

要不你就把它当参数传给Form2吧(说不定你有其它用处上面的不管用的话)

还有 If sp.IsOpen = True Then 
sp.Close() 

End If 
你这里永远不可能成功.
因为Dim sp As New IO.Ports.SerialPort 


[解决办法]
请先把对象确定清楚

SerialPort 是串口类,实例化得到具体引用,每个引用彼此独立

看代码的情况,
在父窗体中使用SerialPort1应该是串口控件或实例化的串口对象,
模块中使用串口类进行实例化。

执行的结果是在同时拥有两个串口实例,父一个,模块一个
由于串口一次只能由一个实例占用,而你的程序实际上是用了两个,
他们必须在对方不使用的情况下进行open才能正常运行,所以会出现
 Message="对端口“com1”的访问被拒绝,

同楼上,建议你把父的串口去掉,都使用同一串口对象,就不会有问题了。

或者把串口对象和发送程序都作在主窗体,做成静态共享
public sp As New IO.Ports.SerialPort 
public Static sub sp_cmd(add_code, data_code, qu & lie) 

在子窗体调用时,使用main.sp.Close() 和main.sp_cmd应该就可以了

[解决办法]

探讨
回1楼的,定义成public的话那在窗体里面的接收事件要怎么处理了呢?

[解决办法]
1:当参数传

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Form2 As New Form2
Form2.SetParameters(SerialPort1)
Form2.Show()
End Sub
End Class


Public Class Form2
Private SerialPort1 As SerialPort
Public Sub SetParameters(ByVal setSerialPort As SerialPort)
SerialPort1 = setSerialPort
End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.Close()
End Sub
End Class

2'定义全局
Module Module1
Public PubSerialPort As IO.Ports.SerialPort
End Module
'记得在主窗口初始化

热点排行