討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
有關RS232接收問題
更改我的閱讀文章字型大小
作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/28 下午 09:24:04
各位大大好:
我最近有個專題需要利用RS232接收一串16進位的資料,共有將近快60Byte的資料
例如: 8051傳送 50 57 11 2 33 44 55 D A .....
判斷第三位置為11時,我就將VB上的LED1亮起..或者其他動作
判斷第五位置為33時,我就將VB上的LED2亮起..或者其他動作
作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/28 下午 09:25:28
是否能提供範例讓我參考 謝謝
作者 : loulo(小樓)討論區板主 Visual Basic曠世奇才貼文超過1000則人氣指數超過10000點
[ 貼文 1817 | 人氣 11470 | 評價 8620 | 評價/貼文 4.74 | 送出評價 38 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人c52671註記此篇回應為很有道理 2008/4/28 下午 09:34:30
一本文魁出版的VB6與RS232書籍有粉多的範例可以參考....

如果要爬文,請先登入討論版後再利用右方的搜尋方塊,有很多RS232接收的程式碼可以參閱!
你的232應該要設定為BINARY接收
把收進來的資料分解處理

DIM inbuf() as byte

inbuf=mscomm1.input

for x= Lbound(inbuf()) to UBound(inbuf())
     if inbuf(x)=&h11 then
     led1亮
     elseif inbuf(x)=&h22 then
     led2亮
     end if
next
作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/28 下午 09:44:33
喔喔 大概有點了解 最近為這個苦惱中,之前狂爬文但是都沒看到
先來試看看了
謝謝您
作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/28 下午 09:49:01
不過一直出現陣列索引超出範圍~_~
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/28 下午 10:13:44
>不過一直出現陣列索引超出範圍~_~

把程式貼出來,讓大家研究看看吧!是照小樓大大建議的去做嗎?
作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/28 下午 10:40:23
Private Sub MSComm1_OnComm()

Dim inbuf() As Byte

inbuf = MSComm1.Input

For x = LBound(inbuf()) To UBound(inbuf())
     If inbuf(0) = &H50 Then
     Slider1 = 2
     ElseIf inbuf(1) = &H57 Then
     Slider2 = 5
     End If
Next
    
End Sub
================================
值送出來時是 50 57 11 22 33 44 55 D A......
他有偵測到 inbuf(0) = &H50 並有 Slider1 = 2

但是我如我要每個位置獨立出來偵測並顯示我要的動作的話要怎樣寫會比較好?
例如 50 57 11 22 33 44 55 D A......


第三位 11 時 Slider1 = 2 , 13 時 Slider1 = 3 , 14時 Slider1 = 4
第四位 22 時 Slider2 = 6 , 23 時 Slider2 = 7 , 14時 Slider2 = 8
持續下去偵測每個位置變化 ,並去變動很多Slider的值 .且同時

所以我會有很多的Slider,對應每個不同位置
Slider1 對應 第三位置
Slider2 對應 第四位置
Slider3 對應 第五位置

當每個位置的值變化時去改變所對應的Slider值.
====================================================
這樣說明各位大大是否了解小弟我的難處,麻煩各位大大是否能給個方向與範例,
謝謝各位聆聽小弟的問題,

作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/28 下午 10:58:24
Dim inbuf() As Byte

inbuf = MSComm1.Input

For x = LBound(inbuf()) To UBound(inbuf())
     If inbuf(x) = &H57 Then
     Slider1 = 2
     ElseIf inbuf(x) = &H33 Then
     Slider2 = 5
     End If

Next
=====================================
用大大的方法,因該是我所送出的值中如果有 57 33 並分別做不同動作
但是我是需要獨立出來偵測每個位置的變化去變化每種不同的Slider,
=====================================
補充一下:
每次一筆資料為 50 57 11 33 44 55 D A
50 57 為開頭 D A 為結束
------------------------------
11 33 44 55 是所要去偵測變化的data

分別有可能為 第幾個Slider 值為多少 的資料型態
-------------------------------

8051部份會丟出一次 7筆資料出來
=======================================
這樣是否能讓大大們更了解小弟問題,
謝謝各位大大聆聽.
作者 : loulo(小樓)討論區板主 Visual Basic曠世奇才貼文超過1000則人氣指數超過10000點
[ 貼文 1817 | 人氣 11470 | 評價 8620 | 評價/貼文 4.74 | 送出評價 38 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/29 上午 07:53:58
Private Sub MSComm1_OnComm()
Dim inBuf() As Byte
Select Case MSComm1.CommEvent
    Case comEvReceive
     inBuf = MSComm1.Input
     For x = LBound(inbuf()) To UBound(inbuf())
     If inbuf(x)=&H50 then
     清除所有燈號
     elseIf inbuf(x) = &H57 Then
     Slider1 = 2
     ElseIf inbuf(x) = &H33 Then
     Slider2 = 5
     End If
     Next
    End Select
End Sub

哪裡出了問題!請把問題[點]說清楚........執行後有哪裡不一樣!
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/29 下午 01:16:23
>補充一下:
>每次一筆資料為 50 57 11 33 44 55 D A
>50 57 為開頭 D A 為結束
>------------------------------
>11 33 44 55 是所要去偵測變化的data
>分別有可能為 第幾個Slider 值為多少 的資料型態
>-------------------------------
>8051部份會丟出一次 7筆資料出來
>=======================================
>這樣是否能讓大大們更了解小弟問題,
>謝謝各位大大聆聽

所以您的問題不是溢位了喔!您有幾個Slider?每一筆50 57和D A之間的data byte數目有固定嗎?7筆是不同的Slider?
作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/29 下午 06:20:07
不好意思,由於有點亂,我重新整理我的問題,
============================
8051部分所送出的值如下:
50 57 00 18 19 20 21 22 00 00 00 00 00
     00 23 24 25 26 27 00 00 00 00 00
     00 28 29 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 0D 0A

說明:
(1) 50 57 為每次資料的開頭.
(2) 0D 0A 為每次資料的結束.
(3) 共有12個 Slider

18的"位置" 是控制Slider1 ; 當 18變成 05 Slider1 = 5
19的"位置" 是控制Slider2 ; 當 19變成 06 Slider2 = 6
20的"位置" 是控制Slider3 ; 當 20變成 07 Slider3 = 7
21的"位置" 是控制Slider4 ; 當 21變成 08 Slider4 = 8
22的"位置" 是控制Slider5 ; 當 22變成 09 Slider5 = 9
23的"位置" 是控制Slider6 ; 當 23變成 0A Slider6 = 10
24的"位置" 是控制Slider7 ; 當 24變成 0B Slider7 = 11
25的"位置" 是控制Slider8 ; 當 25變成 0C Slider8 = 12
26的"位置" 是控制Slider9 ; 當 26變成 0D Slider9 = 13
27的"位置" 是控制Slider10 ; 當 27變成 0E Slider10 = 14
28的"位置" 是控制Slider11 ; 當 28變成 0F Slider11 = 15
29的"位置" 是控制Slider12 ; 當 29變成 10 Slider12 = 16

=============================================
所以每次會送出 59 byte

50 57 00 18 19 20 21 22 00 00 00 00 00
     00 23 24 25 26 27 00 00 00 00 00
     00 28 29 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 0D 0A

當收到一筆資料時,去偵測 18-29這些"位置"的值為多少.並去改變所對應的Slider直.
==============================================
真的很抱歉,之前有點不太了解自己的問題就亂發問,造成各位的困擾與疑惑.
這樣的說明各位大大是否了解小弟的問題所在.希望大大們能幫小弟><"
最後.謝謝各位大大聆聽小弟的問題!^^"





作者 : loulo(小樓)討論區板主 Visual Basic曠世奇才貼文超過1000則人氣指數超過10000點
[ 貼文 1817 | 人氣 11470 | 評價 8620 | 評價/貼文 4.74 | 送出評價 38 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人c52671註記此篇回應為很有道理 2008/4/29 下午 07:43:35
沒有啥大問題啦!只是標準運算而已...
多一個宣告在form表投
dim SByte() as byte
接收端一樣用inBuf()陣列去接收,但是收下來的資料先copy一份到另一個陣列去處理就好了

copy下來的陣列在去找出頭碼和末碼的位置,並把它依序放好....
頭碼一定要放在SByte(0)的位置,而末碼應該就是在SByte(58)的位置[一共59筆資料計算]
再來可以直接用If判斷式直接判斷就可以了
IF SByte(18)=&H05 then .....
....................


作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/30 下午 12:50:39
不好意思,想請問個問題
假設我送出來的值為 55 57 11 22 33 44 55 66 77
====================================
(實驗)
我把inBuf()所接收的直送出來顯示
(1)
第一次送出來時都只有55顯示出來
第二次可能55 57 11
第三次之後 才會完整的顯示我的值
有時候第二次也能完整的把我值顯示出來.
(2)
送出來的值 55 57 11 22 33 44 55 66 77
顯示出來是 57 11 22 33 44 55 66 77 55
第一位跑去最後一位
======================================
(問題)
我讀取前兩位值去動作都沒有任何問題,但是讀取後面直就會有問題
例如
55 57 11 22 33 44 55 66 77
當第0位55時LED1 ON 沒問題
   第1位57時LED2 ON 沒問題
   當我去偵測 第2位11時LED3 ON (這部份就有問題) *並產生溢位問題* !

所以是否是因為一開始值沒有完整的讀取出來 我就去偵測後面位元造成溢位問題發生?
===================================================
主要動作架構是 當我VB一顆按鈕ON值 8051就會送出55 57 11 22 33 44 55 66 77...
===================================================
因為VB程式撰寫方式有點不了解,是否大大能提供大概的撰寫方式架構,讓小弟能參考
謝謝各位大大的聆聽小弟的問題.謝謝!!^^"
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人c52671註記此篇回應為很有道理 2008/4/30 下午 01:42:15
>(問題)
>我讀取前兩位值去動作都沒有任何問題,但是讀取後面直就會有問題
>例如
>55 57 11 22 33 44 55 66 77
>當第0位55時LED1 ON 沒問題
> 第1位57時LED2 ON 沒問題
> 當我去偵測 第2位11時LED3 ON (這部份就有問題) *並產生溢位問題* !
>所以是否是因為一開始值沒有完整的讀取出來 我就去偵測後面位元造成溢位問題發生?
>===================================================
>主要動作架構是 當我VB一顆按鈕ON值 8051就會送出55 57 11 22 33 44 55 66 77...
>===================================================
>因為VB程式撰寫方式有點不了解,是否大大能提供大概的撰寫方式架構,讓小弟能參考
>謝謝各位大大的聆聽小弟的問題.謝謝!!^^"

把您的程式貼出來,才能判斷是否語法哪裡出錯,造成溢位,讀取的語法是怎麼寫的?VB要傳給8051什麼指令,8051才會送出資料?送一次?送七次?連續送?間隔?
作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/30 下午 09:45:38
8051一次送出來是這樣一筆,也只有這一筆

50 57 00 18 19 20 21 22 00 00 00 00 00
     00 23 24 25 26 27 00 00 00 00 00
     00 28 29 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00
     00 00 00 00 00 00 00 00 00 00 00 0D 0A

dim SByte() as byte '另外個陣列
主要是我對vb不太了解,不知怎樣去撰寫當判斷到50 57 時
開始正確的寫入另外個陣列的SByte(0),SByte(1)
並開始去判斷每個位置的值
真的很不好意思小弟還很新手,懇請高手們能幫小弟有個架構><"
=====================================
Private Sub OPENsw_Click()

 MSComm1.PortOpen = True '開啟通訊埠
 'MSComm2.PortOpen = True
 PWRled.FillColor = RGB(255, 0, 0) '通訊埠指示燈熄滅
 OPENsw.Enabled = False '把OPENsw按鈕失效
 CLOSEsw.Enabled = True '把CLOSEsw按鈕致能
 Timer1.Enabled = True
End Sub

Private Sub MSComm1_OnComm()
Dim inBuf() As Byte
Select Case MSComm1.CommEvent
    Case comEvReceive
     inBuf = MSComm1.Input
     For x = LBound(inbuf()) To UBound(inbuf())
     SByte() = SByte(0)


     Next
    End Select
End Sub
====================================

並且我也利用下面程式去看我送出的值

MSComm1.RThreshold = 9

MSComm1.InputMode = comInputModeBinary

Dim Arr() As Byte
Dim Buffer$

Arr = MSComm1.Input
  For i = LBound(Arr) To UBound(Arr)
  Buffer = Buffer + Hex(Arr(i)) + Chr(32)
Next i

Text2.Text = Buffer

發現我值雖然正確,但是不固定會亂跳,每送一次值的位置都不是固定的><
=====================================
感謝大大們聆聽小弟問題,真的很不好意思,小弟我還在學可能需要大大的幫忙!!!><"""
懇請大大能幫我架架構><"
作者 : loulo(小樓)討論區板主 Visual Basic曠世奇才貼文超過1000則人氣指數超過10000點
[ 貼文 1817 | 人氣 11470 | 評價 8620 | 評價/貼文 4.74 | 送出評價 38 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人c52671註記此篇回應為最佳解答 2008/4/30 下午 11:03:29
把接收位元改為1
怎麼會是9呢...一共不是59個byte嗎?

宣告一個固定陣列吧
dim Sbyte(60) as byte


接收中斷事件
dim Inbuf() as byte
dim x,y,z as integer
z=0
inbuf=mscomm1.input
for x=Lbound(inbuf()) to Ubound(inbuf())
     if inbuf(x)=&H55 then
     y=0
     elseif inbuf(x)=&H0A then
     z=1 '表示接收全部完成
     exit for
     end if
     on error resume next '只是防止y>60造成Sbyte溢位
     Sbyte(y)=inbuf(x)
     y=y+1
next


if z=1 then
   對應陣列有你的資料
   Sbyte(0)=......
end if


作者 : c52671(TOMS)
[ 貼文 10 | 人氣 2159 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/5/1 上午 12:12:47
恩,剛剛實驗結果 因該已經接近我所要的了.真是超級感謝大大的.
只能怪我太弱~_~還需要好好k書.
最後. 還是非常的感謝大大幫忙...
未來還有任何問題,還請大大多多指教
謝謝^^"
作者 : leems168(nelson)
[ 貼文 1 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/10/9 下午 05:05:18
您好,我有CASE需要將RS232機器的數據導至另一資料庫
若有興趣可跟我連繫 02-33221372 李先生 NELSON@KANGBO.COM.TW
 板主 : 小樓
 > Visual Basic 6.0/VBA - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual Basic 6.0/VBA - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual Basic 6.0/VBA
1 阿戊 10670 
2 小樓 8650 
3 Jones 5270 
4 水瓶天賞 2340 
5 joe 2230 
6 史努比 1950 
7 阿呆紅 1440 
8 tt's 1250 
9 青衫 1150 
10 羅啟章 1020 
Visual Basic 6.0/VBA
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.1875