台灣最大程式設計社群網站
線上人數
677
 
會員總數:243462
討論主題:188180
歡迎您免費加入會員
討論區列表 >> VB6 >> VB6 serialport發送與接收 RS485
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
VB6 serialport發送與接收 RS485
價值 : 100 QP  點閱數:290 回應數:4

樓主

賴韋豪
門外漢
0 1
8 0
發送站內信

各位幫我解個惑

我用的是RS485轉USB modbus RTU形式

用測試軟體傳送的碼為 01 03 00 00 00 01 +2個檢查碼
接收的碼為 01 03 02 17 74 B7 93 (取17跟74用16進制轉成10進制在*0.01即為我要的值)
但我怎樣就是收不到 有出現過亂碼或是0或是收不到 不知道發送跟接收方面哪邊有問題
查過緩衝區serialport.readex
以下是我的程式碼 幫我看看哪邊有問題


Dim cmd(8) As Byte
Dim crcck(2) As Byte
Dim InByte(8) As Char
Dim i As String
Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
If (Timer3.Interval = 100) Then '計時器計時秒數為一秒
Timer3.Interval = 1000
End If
cmd(0) = &H1
cmd(1) = &H3
cmd(2) = &H0
cmd(3) = &H0
cmd(4) = &H0
cmd(5) = &H1
crcck(2) = CRC16(cmd, 0, 6) 'CRC16檢查碼
cmd(6) = crcck(1)
cmd(7) = crcck(0)
SerialPort1.Write(cmd, 0, 8) '發送
System.Threading.Thread.Sleep(10) '延遲
If SerialPort1.BytesToRead > 0 Then
InByte(SerialPort1.BytesToRead) = New Char
i = SerialPort1.Read(InByte, 0, SerialPort1.BytesToRead)
Dim num As Integer
Dim x8 As String
For i As Integer = 0 To InByte.Length - 1
x8 = Val("&H" & InByte(4).ToString() + "&H" & InByte(5).ToString()) '選擇要轉碼的byte位子
Dim hexString8 As String
hexString8 = x8
num = Int32.Parse(hexString8, System.Globalization.NumberStyles.HexNumber) '轉碼
item1 = Math.Round((num * 0.01), 1) '計算
TextBox2.Text = item1

Next i
End If
End Sub

搜尋相關Tags的文章: [ RS485 ] , [ serialport ] , [ VB ] ,
本篇文章發表於2018-07-13 12:41
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

mc-os.com
檢舉此回應
首先聲明,在下不懂VB,只是最近也在寫Modbus協議的程式,分享一下心得:
調試、驗證發送的指令(碼)是否正確
1.首先最好在電腦上安裝一個虛擬串口的軟體Virtual Serial Port Driver(VSPD),在電腦虛擬兩個可以互相通訊的串口;
2.Download Commix 軟體—— 推薦它是因為它可以自動計算后4位的CRC校驗碼并發送;
當然,也有複雜的就是下載Modbus Salve軟體,它可以完全模擬PLC等Slave端,并能對正確的Modbus指令(碼)做出應答;
Modbus RTU 的通訊,只要遵守Modbus協議,指令+CRC校驗碼都準確,Slave端就100%能應答;
本篇文章回覆於2018-07-19 22:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

mc-os.com
檢舉此回應
按樓主的指令(碼)來測試,結果如下
主機發送:01 03 00 00 00 01 84 0A
(32 ms)
Slave應答:01 03 02 30 21 6C 5C

Slave應答返回的 30 21 換算十進制為 12321,是準確的;
本篇文章回覆於2018-07-19 22:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

mc-os.com
檢舉此回應
如果樓主發送:01 03 00 00 00 01 的CRC檢查碼不是 84 0A,那就不符合Modbus協議——指令(碼)沒發對;
所以,先檢查下,發送的指令對錯
本篇文章回覆於2018-07-19 22:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

dars8184
檢舉此回應
System.Threading.Thread.Sleep(10) '延遲
延遲久一點,10改成100試試
本篇文章回覆於2018-08-19 17:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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