台灣最大程式設計社群網站
線上人數
875
 
會員總數:246134
討論主題:189713
歡迎您免費加入會員
討論區列表 >> VB.NET >> SerialPort1_DataReceived 的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
SerialPort1_DataReceived 的問題
價值 : 200 QP  點閱數:400 回應數:3
樓主

09
門外漢
0 2
149 3
發送站內信

之前有請教過版上的高手
關於RS232回傳值的問題
使用SerialPort1_DataReceived的方法成功收到回傳的值

目前用按鍵觸發可以順利接收到值

發跟收的Protocol是寫死 發16個給板子 板子回傳34個回來

下面是當Button2按下去時 發送RichTextBox1所輸入的訊號(16位元)經由RS232傳輸給板子




現在想要實現的是,當我按下按鍵,想要時隔(eq.5秒)自動再發送一次
我試著把


這一段貼兩次變成



(我知道這樣很蠢)

板子回傳給我的訊號的確是兩次的值且數值正確(每次回來34位元)
但是當我寫成



就我的理解 這樣寫不就是跟上面連續PO一樣的程式碼兩次一樣的意思?
可是板子就只回傳一次訊號而已,還是我理解錯誤?

另外有一個問題是我有試著用Timer寫



Timer的觸發我就寫在Button2_Click的最下面,
結果回傳的值第一次正確(回傳34位元),第二次開始就不是34位元
而是開始跑一堆亂碼,例如只收到6個位元,或是只收到5個,

我想請問的是,如果我使用DataReceived的方式,固定時間要發送訊號給板子,
再把板子回傳給我的訊號顯示出來,

目前這個狀況我個人猜想,是不是暫存區之類的需要清空?
因為沒有清空,所以第二次進來的值跟第一次的值疊加再一起導致亂碼?
可是當我連續輸入兩次SerialPort1.Write 板子又很正常的給了我兩次完整的訊號...

還是有哪邊我沒有顧慮到的狀況?

這個問題困擾我快一個禮拜了...

我知道我觀念可能還很差 但麻煩版上的前輩指引了,謝謝!!

搜尋相關Tags的文章: [ serialport ] , [ DataReceived ] , [ ] ,
本篇文章發表於2019-09-24 17:14
1樓
回應

P陳
檢舉此回應
rs232 是非同步處理的 我會這樣寫

load 時
Timer1.enable=false
Timer1.interval=700
sendcount=0
end load

button1()
timer1.enable=true
end button1

timer1.tick()
senddata to rs232
sendcount+=1
if sendcount=10 then timer1.enable=false (送10次後不送了 每次隔700 (0.7秒))
end timer1


DataReceived
read from rs232 (由於是非同步所以要偵測是否接收完畢了)
show data
end received
--------------------------------------------
註:您 timer1 程式怪怪的,在SLEEP 時 timer1 還是會被啟動






本篇文章回覆於2019-09-24 19:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

Ader Chen
檢舉此回應
以下個人經驗, 不一定適合所有情況, 僅供參考.

個人遇過兩種與儀器設備通訊方式:
A. 從PC端對儀器下一個命令後, 儀器會定時、或是狀態改變時, <儀器主動>傳送資料給PC端.
這種情況適合用 DataReceived 事件來收資料.
不過這種情況我自己很少遇到, 搞不好幾年才會遇過一次.
(不代表這方式不好, 只是個人經歷較少而已)

我遇到的大部分都是:
B. 從PC端對儀器下一個命令, <儀器被動>回覆資料, 有需要時再下一次命令, 儀器才會再被動回覆資料...
這種情況就不大適合用 DataReceived 事件來收資料,
處理 DataReceived 事件是非同步模式, 一問一答的同步模式反而更簡單:
(開一個專用的執行緒跑, 免得鎖住 UI)
1. PC發送命令給儀器設備,
2. Sleep 等一下下
3. 接收儀器回傳的資料,
若資料量少, 這樣就結束了,
若資料量很大, 可能用個迴圈包住 2. 3. 再組資料.

一樣請參閱 Bill 前輩的文章:
Serial Port 系列(19) 基本篇 -- 發送回應(五)
https://dotblogs.com.tw/billchung/2012/03/11/70651

如果要定時不斷運行這種問答, 也就在用個迴圈把上面程序包在專用的執行緒上跑就好了.
本篇文章回覆於2019-09-24 20:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

誰是誰
檢舉此回應
https://dotblogs.com.tw/billchung/series/serial%20port/1
本篇文章回覆於2019-09-25 14:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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