[問題] 用TIMER定時發送資料

看板C_Sharp (C#)作者 (克里斯)時間12年前 (2013/01/04 11:42), 編輯推噓0(0022)
留言22則, 5人參與, 最新討論串1/2 (看更多)
小弟寫了一個用232傳輸資料的程式 想利用timer達到定時發送資料的功能(如每隔兩秒發送一次) 發送程式 { if (timer1.Enabled==false) { string s1 = "\x02" + Convert.ToString(A_kg) + "\x0d" + "\x0a"; serialport.Write(s1); timer1.Enabled=true;//開啟計時器 } } private void timer1_Tick(object sender, EventArgs e) { counter++ if (counter==3)//三秒 { timer1.Enabled=false;關閉計時器 } } 可是卻沒辦法正常啟動 似乎計時器無法觸發 想問問要怎麼改才能照所需的功能執行 新手一枚 請大家多多指教<(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 39.12.111.196

01/04 12:47, , 1F
您是指timer1.Start(); ??
01/04 12:47, 1F
恩 我是用VS2008 c# 想知道要怎麼在發送資料的執行緒插入一個TIMER(時間)達到定時發送的功能 剛接觸C# 想問問要怎麼寫才正確>"< ※ 編輯: chris70211 來自: 27.246.57.225 (01/04 13:25)

01/04 14:21, , 2F
counter有歸零?
01/04 14:21, 2F

01/04 15:59, , 3F
timer不用關閉,應該要一直計數..
01/04 15:59, 3F

01/04 16:00, , 4F
另外在你的發送端程式,加個判斷式
01/04 16:00, 4F

01/04 16:01, , 5F
if(counter%2==0) {...}
01/04 16:01, 5F

01/04 17:51, , 6F
兩秒一次就timer1.Interval = 2000 就好
01/04 17:51, 6F

01/04 17:55, , 7F
要定時做的動作是寫在timer1_Tick裡
01/04 17:55, 7F

01/06 18:39, , 8F
如果是寫Service觸發不是寫在Tick,另外預設值Enabled有開?
01/06 18:39, 8F
由於在發送資料之前有利用usb將資料接收並運算 如果將發送資料的動作寫在Tick裡 由於我是用Tick.Emabled=true 但這樣好像不會正確的轉進Tick裡動作 因為動作需求 是利用一個button進行資料接收運算及發送 無法將發送資料的動作寫在另一個BUTTON PS.小弟真的是新手一枚 有什麼觀念不清的地方 請大家多多見諒!! 也感謝大家的回覆 <(_ _)> ※ 編輯: chris70211 來自: 39.10.231.185 (01/07 08:39)

01/07 22:42, , 9F
我不是很看得懂你的問題跟需求,可以寫清楚點,試著跑debug看
01/07 22:42, 9F
剛接觸c#兩三個禮拜而已 之前主要是用matlab再寫程式 所以一些物件導向 執行緒的觀念都不是很清楚 (還在努力中) 只是有鑑於時間的緊迫性沒辦法慢慢學 只好先從看別人的code 改code著手 目前的程式是用usb接收資料 然後根據時間設定來發送資料(232) 而主要的動作都寫在接收資料的BUTTON內 所以不知道要怎麼樣將接收資料的BUTTON與 計時器的BUTTON做結合 至於將主動做寫在計時器這一點目前還在思考怎麼做 不知道能不能寫成像下面這樣: BUTTON1~主要動作 { 接收資料 232發送命令同時進行計時&設定時間(例如三秒) 到達設定時間(三秒) 將第三秒擷取到的這筆資料再透過232發送出去 } BUTTON2~計時 { count++ if (count==3){關閉計時器} } 接收資料的部分不需要跟計時器同步動作(應該沒辦法吧) 之前試著用 timer.enable=true或false 不過似乎沒辦法觸發 所以想了解應該怎麼寫才能達到我的動作需求 如果有什麼觀念錯誤 請體諒原PO還是個學不到一個月的菜鳥吧Q__Q ※ 編輯: chris70211 來自: 114.38.114.90 (01/07 23:57)

01/08 03:36, , 10F
timer是每過一段時間(timer.Interval)做同一件事
01/08 03:36, 10F

01/08 03:39, , 11F
你需要的等一段時間後做一次事情,應該用Thread.Sleep(3000)
01/08 03:39, 11F

01/08 03:44, , 12F
你還是先講清楚你是要定時"每"x秒發一次
01/08 03:44, 12F

01/08 03:44, , 13F
還是按按鈕後,發送命令→等x秒→發送命令→結束
01/08 03:44, 13F

01/08 07:40, , 14F
有沒完整專案檔可提供下載?
01/08 07:40, 14F
S大 如你所說是按完按鈕後發送命令->等x秒->接收usb 資料->發送下一個命令 保持這個迴圈 秒數設定的部分會放在陣列 如果是這樣的動作的話是否用 Thread Sleep即可? H大我是抓網路上的generic_hid_cs這是檔名 可是我忘記在哪抓得了>"< 如果你有需要 http://www.lvr.com/usbcode.htm 這個對你應該有用 ※ 編輯: chris70211 來自: 39.12.23.249 (01/08 08:42)

01/08 09:03, , 15F
XD HID 我只是想解你的timer問題 不是很確定 若只是要收到
01/08 09:03, 15F

01/08 09:04, , 16F
資料後delay3S送232寫在同個button1應該可以達到阿
01/08 09:04, 16F

01/08 09:10, , 17F
btn1>收usb>delay3s>送232 這樣嗎?
01/08 09:10, 17F

01/08 09:16, , 18F
要loop就給for迴圈或timer內call button1
01/08 09:16, 18F

01/08 09:16, , 19F
for UI可能會卡住 用timer也許比較理想
01/08 09:16, 19F

01/08 11:16, , 20F
等X秒後再做動作,是用Sleep,想要按下去"每"兩秒抓一次用
01/08 11:16, 20F

01/08 11:23, , 21F
Timer,而且我有點困惑,你要先等待兩秒,再去抓,那Timer設長一
01/08 11:23, 21F

01/08 11:25, , 22F
比較好,Sleep兩秒>>每兩秒執行Timer,會只有第一次Sleep兩秒
01/08 11:25, 22F
文章代碼(AID): #1Gva-vRM (C_Sharp)
文章代碼(AID): #1Gva-vRM (C_Sharp)