台灣最大程式設計社群網站
線上人數
1809
 
會員總數:242275
討論主題:187366
歡迎您免費加入會員
討論區列表 >> VB.NET >> serial port的連接埠相同,不同device id 通訊問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
serial port的連接埠相同,不同device id 通訊問題
價值 : 50 QP  點閱數:421 回應數:17

樓主

瑪格麗特
初學者
30 13
417 34
發送站內信

寫windows form視窗程式與硬體通訊,這些硬體使用相同的連接埠,但是硬體device id不同,通訊協定使用Modbus RTU,同一支程式可以同時和多個硬體通訊,只有和一個硬體通訊沒有問題,和第二個硬體通訊會開啟第二個視窗,程式碼如下:
Dim DownLoadForm As New Form2

If My.Application.OpenForms.Item("Form2") IsNot Nothing = False Then
DownLoadForm.AddDevice("2", mPortName)
DownLoadForm.Show()
End If

在Form2中無法再開啟相同的連接埠(因為在Form1連接埠己經被開),在Form2中也無法接收serial port的資料,我要如何在Form2和第二個硬體通訊呢?感謝!







搜尋相關Tags的文章: [ serial port通訊問題 ] ,
本篇文章發表於2018-03-01 09:56
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

P陳
檢舉此回應

那就關掉再重開即可,類似如下:

if rs232.isopen then
rs232.close
end if
rs232.open
本篇文章回覆於2018-03-01 16:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

瑪格麗特
檢舉此回應
感謝P陳的回覆,因為第一個硬體正在通訊中,所以serial port不能關掉,serial port關掉的話,就中斷了和第一個硬體的通訊。
本篇文章回覆於2018-03-01 17:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

P陳
檢舉此回應

對 一個PORT 同一時間會跟一個設備相連

所以二個 port 會有二個PortNO,各自連各自的 PortNO 互沒影響才對。 (COM4 COM5 等等)


本篇文章回覆於2018-03-01 17:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

P陳
檢舉此回應
不知您程式如何寫的?
再來你將會碰到 【多執行緒】的問題,最近才被這搞的很慘。

本篇文章回覆於2018-03-01 17:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

瑪格麗特
檢舉此回應
To P陳:
目前情況是多個硬體共用同一個連接埠,因為在測試無線模組,有一個無線的模組,這個無線模組連接至電腦的連接埠,經由這個無線模組可以同時和多個硬體通訊,所以只有一個連接埠,寫視窗程式接收不同硬體送出的資料,以device id區分是哪個硬體傳送的資料。
本篇文章回覆於2018-03-01 17:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

P陳
檢舉此回應
瞭解了,跟我碰到的狀況差不多,作法有二種
先講第一種
1.寫一段 class 或 module 並打開連接埠(在startform 時打開)
2.Form1~Form9 透過 Property 去存取 連接埠 -再送到-> Device 。
3.這樣才有辦法隨時加 Form 都不用改程式。

---------------------------------------
4.不同的設備有不同的畫面嗎?否則應該一個 Form 就解決了
本篇文章回覆於2018-03-01 18:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

瑪格麗特
檢舉此回應
To P陳:
我在我的Windows Form專案中,新增一個類別檔,將serial port設定、open、讀取資料寫在這個類別檔中,並且加入Property GetForm2Data() As Byte()函式,函式如下
Property GetForm2Data() As Byte()
Get
Return Form2Data
End Get

Set(ByVal value As Byte())
Form2Data = value
End Set

End Property

在我的Fom2加入一個timer1,這個Timer1_Tick每隔一秒,Call ClassName.GetForm2Data,可是取出的Form2Data都是0,等於沒有讀到資料,下中斷點進入debugger mode,確認serial port有成功讀到硬體傳送的資料,
我的程式還有哪裡需要修改嗎?謝謝!



本篇文章回覆於2018-03-02 17:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

P陳
檢舉此回應
這樣 掐頭去尾留中間的程式,沒人有辦法猜到你要的是什麼
又沒有你的環境,也沒辦法幫你測

沒環境也沒辦法幫你,且您這種 serial port 的寫法,程式會咬死。

我改到了第四版才找到方法。
本篇文章回覆於2018-03-02 19:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

瑪格麗特
檢舉此回應
我的問題簡化地說就是如何在不同的form中傳遞資料,form.show、form關閉時傳遞資料沒問題,當form在執行中我無法傳遞資料給另一個form。
為了解決這個問題,新增了個類別檔,serial port設定、open、讀寫serial port資料都寫在這個類別檔中,其他的form再去呼叫類別檔的Property GetForm2Data()取得資料,但這個方法似
乎也不行。
如果找不到解決方式的話,就將serial port資料寫入文字檔,再由每個form讀取文字檔內容。
本篇文章回覆於2018-03-02 21:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
最有價值解答

P陳
檢舉此回應
因為 Serial Port 是多執行緒在跑的,很考驗開發者的功力。

但是讀資料應該是用
Private Sub Rs232_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles Rs232.DataReceived
End sub

有問題再來討論

祝福你了

本篇文章回覆於2018-03-02 22:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

誰是誰
檢舉此回應
一個serial port 對多個 devices 只能用輪詢。試想,如果電腦發送了一個命令給設備A後,在尚未接收完設備A的回應前,又發送給設備B,此時 A和B 回應可能會交錯在一起,你要如何辨認哪個 byte 是A 的? 哪個 byte 是 B 的 ?
本篇文章回覆於2018-03-03 17:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
不錯的參考

P陳
檢舉此回應
與她的問答中,中間有個類似 HUB 的東西,【無線模組】
電腦經由 rs232 與 無線模組 連絡 再與 硬體device 連絡
而不是 rs232 直接與 硬體device 連絡。

您提的狀況,好像【無線模組】會處理。
沒看到實體,只好猜猜看了,也不一定對。
本篇文章回覆於2018-03-03 20:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

誰是誰
檢舉此回應
想想國道五號接到蘇花改的狀況
本篇文章回覆於2018-03-04 10:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

dars8184
檢舉此回應
Modbus RTU,通訊要獨立出來(要讀取所有裝置的資料),把讀取的資料放到資料陣列,由不同的form顯示
本篇文章回覆於2018-03-06 22:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

瑪格麗特
檢舉此回應
後來找到一個折衷的方式,新增一個類別檔,serial port設定、open、讀取資料寫在這個類別檔中,在這個類別檔中新增 Rs232_DataReceived event handler處理讀取事件,
並且將serial port資料寫入文字檔,再由每個form讀取文字檔內容,其他的winform再引用這個類別檔,因為999%情況是讀取資料,不用擔心送給A設備的資料B設備也會讀取,唯一潛在的問題是多個設備同一時間送出資料,會有資料遺漏的情況。
本篇文章回覆於2018-03-17 13:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.