读书人

vb.net怎么关闭其他窗体的串口救救小

发布时间: 2012-03-16 16:34:56 作者: rapoo

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
'记得在主窗口初始化

读书人网 >VB Dotnet

热点推荐