台灣最大程式設計社群網站
線上人數
671
 
會員總數:244893
討論主題:188887
歡迎您免費加入會員
討論區列表 >> VB6 >> RS232 訊號接收問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
RS232 訊號接收問題
價值 : 100 QP  點閱數:244 回應數:11

樓主

09
門外漢
0 1
31 3
發送站內信

說來慚愧 小弟算是剛接觸VB,本來是MIS,老闆突然要求要我寫程式,
小弟只好硬著頭皮邊做邊學了,大多都是看網路上的教學慢慢摸索,
但是現在遇到瓶頸了...

簡單扼要地講
我們有個韌體工程師弄了一塊板子
電腦端為USB > RS232 > 轉換器 > RS485 > 板子
傳送0103000200066408的訊號過去
板子 > RS485 > 轉換器 > RS232 > 電腦端USB ((廢話?
會回傳01 03 0C 00 01 00 7E 00 00 00 02 00 00 00 00 C7 EE 的訊息回來
電腦端這邊有接上一個RS232跟RS485的轉換器
我有沒有傳成功都是靠著轉換器上面的TX/RX燈號來判定

目前遇到的狀況是(程式碼下面補上)我傳訊號過去 轉換器上的TX有亮(表示有傳過去了?)
接著RX也跟著亮(表示板子看懂我丟的東西,回傳了訊號回來?)
可是問題是回傳的資料都是空白的

我用(modbus 測試軟體) 去傳訊號 確實有收到回傳的資料
目前老闆就是要我把這個功能寫出來,


這邊寫的是 我在RichTextBox1輸入字元 按下Button2 他會轉成byte傳給板子 (這樣理解對嗎?



到這邊為止是OK的 因為訊號有出去有回傳
可問題是接收的部分





本來是預計回傳後 在RichTextBox2上面顯示回傳的值
但是轉換器RX亮了之後 RichTextBox2上面只有類似" "一個空格的東西出來
完全沒有任何值出現 如果是亂碼我可能還會覺得是不是回傳格式的問題...

我有在想是不是[test] AS String 這個東西的問題
他是字串? 可是板子回傳的是16bit的訊號 所以顯示不出來?

小弟資質駑鈍 希望在這邊的高手能給小弟一條明路

搜尋相關Tags的文章: [ serialport ] , [ RS232 ] ,
本篇文章發表於2019-09-09 16:54
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

P陳
檢舉此回應
RichTextBox2.Text &= [text] 'append text <----問題可能出在這

您先改成 RichTextBox2.Text &= asc([text]) 看看有沒有資料

因為回傳的 01 03 0C 並非是文字, 尤其當加到 00 時會發生不可預期的結果
01 03 0C 00 01 00 7E 00 00 00 02 00 00 00 00 C7 EE 的
本篇文章回覆於2019-09-09 17:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

09
檢舉此回應
我試了輸出那邊加了asc,有成功跑出值了,
但只顯示了"1",我猜可能是板子回傳的第一個數字01?
後面的值都沒有跑出來

重複傳入訊號 都只跑到1出來 後面就沒東西了,
是不是asc遇到01跟03之間的" "空白不認識 所以就罷工了?
不知道我這樣理解對不對...
本篇文章回覆於2019-09-10 09:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

P陳
檢舉此回應
大約猜出個7 8 成來了
請 加個計數器
dim Lii as integer=0
再加個 Label1

RichTextBox2.Text &= asc([text]) 後加,不要設中斷點,讓他跑完。

Lii +=1
Label1.text &= Lii & len([text]) & vbcrlf

您就可以猜出問題出在那了

註:我有玩過 VB.NET 的 RS232,但 VB6 的沒有玩過,這種程式別人沒有設備,無法幫您除錯。
本篇文章回覆於2019-09-10 11:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不錯的參考

Ader Chen
檢舉此回應

(這邊是 VB6 討論區,不過看樓主的程式碼是 VB.NET, 不是 VB6)

請參考:Serial Port 系列(8) 基本篇:
https://dotblogs.com.tw/billchung/2012/01/20/66860

找其中的 private void DisplayText 程式碼, 將 Byte() 轉成 String 顯示.

就1行 C# 指令, 轉成 VB.NET
TextBox1.Text &= String.Format("{0}{1}", BitConverter.ToString(Buffer), Environment.NewLine)

Buffer 就是 SerialPort 收到的 Byte().

本篇文章回覆於2019-09-10 12:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

09
檢舉此回應
>> P陳
我試著照您說的加了那幾行

在新創的label上顯示117,分開來看應該是
您設的那個計數的變數 只跑了一次顯示1
字串長度有17
我這樣理解對嗎?

可是這樣就不清楚是他只回傳了1個值回來,還是我只讀出一個值其他讀不到?
他都有抓到字串長度是17了,是不是就代表板子回傳的數值其實是有到電腦端,
只是我這邊抓的方式不對,值都沒出來?

>>Ader Chen
抱歉 我沒注意到PO問題的位子不對..
的確是VB.NET沒錯

很抱歉還有些觀念不太清楚,被老闆趕鴨子上架不得不做中學,
很謝謝你們願意教導我,您給的那個網站我正在從第一步開始讀起。

我也有看到那篇寫著 不建議使用SerialPort1_DataReceived來觸發接收?
但目前只找到這種範例來練習接收訊號
先不論方法的好壞,目前就卡在連值都讀不出來很苦惱..
本篇文章回覆於2019-09-10 14:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

Ader Chen
檢舉此回應
> 被老闆趕鴨子上架不得不做中學 <
加油!

> 那個網站我正在從第一步開始讀起 <
從頭開始建立正確觀念, 以後會少走很多冤枉路.
加油^2

> 不建議使用SerialPort1_DataReceived <
個人覺得要 case by case, 選擇適合的方式,
有些 case 適合被動用 DataReceived 事件,
有些 case 適合主動問答,
個人的情況... 幾乎沒有在用 DataReceived 事件的,
幾乎都是一問一答: 本機問, 遠端答.
case by case,
供參考.

本篇文章回覆於2019-09-10 15:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
最有價值解答

P陳
檢舉此回應
那就對了 共有17個字 因為 Asc() 只會解讀第一個字而已
接下來 您只要將17個字全解開即可 (剛好符合您題目的17個字元)
土法
Label2.text=""
for Lenii = 1 to len([Text])
label2.text &= asc(mid([Text],Lenii,1))
next

高級一點的用 Ader Chen 的作法用Convert 來轉換(但TYPE請注意是否必需是用 byte())
本篇文章回覆於2019-09-10 16:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

P陳
檢舉此回應
Label2.Text &= asc(mid([Text],Lenii,1)) & " "
本篇文章回覆於2019-09-10 16:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

P陳
檢舉此回應

Label2.Text &= String.Format(mid([Text],Lenii,1),"X2") & " "

本篇文章回覆於2019-09-10 16:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
不錯的參考

ak41
檢舉此回應
你用Byte丟也要用Byte收
而不是用.ReadExisting()
這會收到的是依照你編碼的方式收到的值 例如ASCII,UTF-8 ,Big5出來的明碼
接收Modbus RTU協定請用
SerialPort1.Write(Bytes, 0, Bytes.Length)
收到的Array就是Bytes
之後你要再將每個Byte .toString()
本篇文章回覆於2019-09-12 09:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

09
檢舉此回應
>>Ader Chen
感謝你的鼓勵 小弟還在努力學

>>P陳
謝謝你 正常跑出來了
雖然剛學程式很難懂?
但是看到數字跑出來很開心

>>ak41
我也知道用ReadExisting()很不OK阿QQ
只是得先把功能弄出來,您給的那個方法我還沒試過,
但是在找資料的時候有看到,之後會試著用您給的方法寫寫看,謝謝你!
本篇文章回覆於2019-09-17 13:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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