討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
請問如何利用VB透過RS232傳輸指定的值
更改我的閱讀文章字型大小
作者 : bestforever(95無鉛汽油)
[ 貼文 9 | 人氣 2743 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/1 上午 12:58:11
各位大大你們好:
我這裡有些問題想請教各位。我最近想寫出利用VB透過RS232傳輸將指定的值。
我目前做到的是只能傳單一值,例如,我輸入"1",藉由RS232傳出"1"值。
但是,我想要達到給定一串數值(例如,預傳輸值1,2,3,4....),然後可以藉由RS232"依序"傳出。
我試過用迴圈來寫,但似乎沒達到我要的效果。
以下是我的程式。我想要一次傳6個"1"值。但結果都不如預期。
可以幫我看看,是哪裡出錯了。如果有更好的方式,是否能提供。

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True

End Sub
Private Sub Command1_Click()
  For a = 1 To 6
  buf = Trim(Text1.Text)
  MSComm1.Output = Chr(buf)
  Next a
End Sub

Private Sub Command2_Click()
End
End Sub

謝謝各位大大!!

作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人bestforever註記此篇回應為很有道理 2007/8/1 上午 02:31:45
你是想要透過RS232傳輸"1"這個字串嗎?
如果是的話,VB的MSComm傳輸資料的預設值是字串型態

>End Sub
>Private Sub Command1_Click()
> For a = 1 To 6
> buf = Trim(Text1.Text)
> MSComm1.Output = Chr(buf)
> Next a
>End Sub

你的程式,buf未定義,所以buf = Trim(Text1.Text),資料讀進來後,buf會自動轉型變成string型態
後面又接上MSComm1.Output = Chr(buf),這邊因為用chr函數將數值轉成Ascii碼的
字元,所以buf會將資料轉型成Integer型態資料給Chr函數使用
運算的結果會變成
buf = Trim(Text1.Text) '假如buf="1"字串
MSComm1.Output = Chr(buf) 'Chr(buf)會將原本的"1"字串,轉成Ascii Code 1,在送
出去
最後實際送出的是Ascii Code 1這個不可見字元,當然會出問題
其實要傳送6個"1"
你只要在Text1裡面輸入6個1,在直接從MSComm輸出就可以了
Exp:
Private Sub Command1_Click()
mscomm1.output=text1.text
End sub
作者 : bestforever(95無鉛汽油)
[ 貼文 9 | 人氣 2743 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/1 上午 09:43:59
謝謝您的解說 ,讓我學不少。
我的寫程式,主要是由vb來控制ICD2板上的LED。
所以應該是要以Ascii Code的型態傳輸。
簡單的說,如果傳"一個" Ascii Code 1則會讓第ㄧ個LED燈亮,
如果傳"一個" Ascii Code 2則會讓第二個LED燈亮,
如果依次傳"一個" Ascii Code 1和"一個" Ascii Code 2
則會讓第ㄧ個LED燈亮後,第二個LED燈亮。
照理說,如果傳"6個" Ascii Code 1則會讓第ㄧ個LED亮,亮6次(亮的時間較久)。
但似乎顯示的情況,不是這樣。
如果是這樣的話,我該怎麼改善呢。
很抱歉之前沒說仔細。
請再幫我一次吧!謝謝!!
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人bestforever註記此篇回應為很有道理 2007/8/1 上午 10:57:53
我還有幾個疑問,需要你說明一下唷
1. 用VB的MSComm,通過RS232去控制ICD2板的LED,那這個ICD2板是用單晶片與PC做RS232通訊,還是只有一堆純邏輯電路(不用單晶片)去接收RS232的訊號?

>照理說,如果傳'6個' Ascii Code 1則會讓第ㄧ個LED亮,亮6次(亮的時間較久)。
>但似乎顯示的情況,不是這樣。

2. 那這個實際狀況是怎麼顯示?LED閃6次?還是LED只閃一次?還是LED亮的時間不夠久?
    或是送出1後,接下來送出2會造成LED 1顯示不正確?
3. 你期望的顯示方式是要怎麼顯示?是要RS232送出資料後,LED要持續點亮?還是只要一閃
     即逝,有看到亮點就好?或是要點亮幾秒之後才熄滅?
謝謝!!
作者 : bestforever(95無鉛汽油)
[ 貼文 9 | 人氣 2743 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/1 上午 11:25:21
1.這個ICD2板適用單晶片與RS232通訊。整體結構,是這樣的。
我想用VB232作為控制介面,利用RS232來傳輸。
利用VB來設計一個面控制兩顆馬達的轉速。
傳出"一(N)個"Ascil Code 1時,馬達1(N) 轉一圈。
為了顯示是否有傳出資料,我才會以ICD2板上的LED來顯示。
傳出"一個"Ascil Code 1時,馬達1 轉一圈,相對的LED第ㄧ個燈會亮一次。

2.照理說傳'6個' Ascii Code 1則會讓第ㄧ個LED亮,亮6次。
但是我在ICD2板上所看到的。LED顯示的時間不夠久。
如果我依序想傳出1,2,3,4,5,....
ICD2板上的LED燈卻不會跟顯示。

3.期望的顯示方式是,RS232送出資料後只要一閃即逝,有看到亮點就好。
因為我主是想要知道是否有把值傳出去。讓馬達動作。

再次請教您,謝謝!!
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人bestforever註記此篇回應為很有道理 2007/8/1 下午 02:34:49
照你的說明,要利用單晶片,透過RS232去控制步進馬達,送出Ascii Code 1,馬達要轉一圈,
送出Ascii Code 2,馬達要轉2圈,現在只是用LED確認接收的資料是否正確
期望的動作 : 送出1個Ascii Code資料,要在相對應的LED做點亮的動作
假設點亮的單位時間長度為1秒,連續送出n個ascii code,則LED要點亮n x 1秒
這是不是你希望的動作?

實際的動作 : 送出n個連續相同資料,LED點亮時間<n x 1秒
傳一個Ascii code有沒有問題?
如果按照上面的說明,期望跟實際的差異,你應該要回頭去看單晶片的程式有沒有誤動作
1. 單晶片程式,是不是UART收到一個Byte,就馬上Output到Port上?
    如果是的話,我記得UART每次只可以接收一個Byte的資料(不知道我有沒有記錯)
    設RS232 Baudrate為9600,那PC連續傳送6個Ascii的時候,只花了6 / 960 秒
     在6 /960 秒之間,Outport已經被設定6次了,不知道是不是這個原因,出現LED
    點亮時間不夠長
2. 依照上面狀況,連續送ascii code 1,2,3,4,5,每個LED只被點亮1 /960 秒,應該來不及看
     LED有沒有亮,最多只能看到最後一個ascii code點亮LED
3. 如果是UART收到一個Byte,就馬上把Data輸出到Port上,建議,設一個Buffer,先存放
     UART傳來的資料,在LED點亮的Delay時間到了之後,在去讀取Buffer點亮下一個LED
4. 建議你在點亮LED的設定上,可以用二進制去點亮,LED,至少你可以看到ascii code 127
    Ascii code : D7................D0
     1 : 00000001
     2 : 00000010
     3 : 00000011
     ...........
     127 : 01111111
這是按照你的資訊,想到的問題點
Thanks!!!
作者 : bestforever(95無鉛汽油)
[ 貼文 9 | 人氣 2743 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/1 下午 06:44:22
恩,經你這麼一說,似乎是間隔時間太短問題。
如果現在想要延長每一個資料傳輸間的時間。該如何做到呢?
我試過用timer來做。

>Private Sub Timer1_Timer()

>For A = 1 To 6
>test = test + 1

>If test = 4 Then
>MSComm1.Output = Chr(A)
>test = 0
>End If

>Text4.Text = test
>Next A
End Sub
我現在想做到的是,利用timer1來計數。
每數到4(約4秒),就傳出一個值(一四傳出1,2,3...6)。
但還是有問題,這次LED登完全沒亮了....
到底是哪裡出錯了呢?

如果大大有亙好的方法,能否傳授一下。
再次請您幫忙,謝謝!!
作者 : 793643(Max) 貼文超過200則
[ 貼文 274 | 人氣 2420 | 評價 600 | 評價/貼文 2.19 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/1 下午 08:30:34
>Private Sub Timer1_Timer()
>
>For A = 1 To 6
>test = test + 1
>
>If test = 4 Then
>MSComm1.Output = Chr(A)
>test = 0
>End If
>
>Text4.Text = test
>Next A
>End Sub
>我現在想做到的是,利用timer1來計數。
>每數到4(約4秒),就傳出一個值(一四傳出1,2,3...6)。
你Timer1事件裡的副程式有問題唷,跟你期望的輸出差異很大,假設Timer1的Interval=1000
就是Timer1每1秒會跑一次副程式,你可以在分析你的程式一下,Timer1執行程式的時候
會把For迴圈裡的全部跑完,因為你加上If test=4判斷式,所以每次到輸出MSComm的時候
A只會等於5,換句話說,就是變成每秒輸出一個Ascii code 5到RS232而已
如果希望每秒傳出1~6的話,要修改一下,底下的給你做參考,test設定成public或static
如果未設定每run一次timer1的副程式test都會被歸0重新計算
把timer1的interval設成4000,就會每4秒傳送一次了
public test as Byte
Private Sub Timer1_Timer()
test=1+(test mod 6)
MSComm1.Output = Chr(test)
Text4.Text = test
End Sub


>但還是有問題,這次LED登完全沒亮了....
>到底是哪裡出錯了呢?
先回復原先設定,試著只傳送"1"看看是不是正常,出錯的地方很多,要一樣一樣去看,有可能
LED壞了,有可能單晶片處理"5"方式不對,有可能線路Open,這部分是單晶片跟硬體線路,
我也幫不上忙

>如果大大有亙好的方法,能否傳授一下。
>再次請您幫忙,謝謝!!
就算有更好的方法,也幫不上忙,因為你要做的東西是VB與單晶片做搭配,單晶片程式跟硬體份
量佔了99%以上,反觀VB控制RS232,來來去去就那麼幾招,充其量我也只不過幫你解決不到
1%的問題,先靜下心來,仔細檢查單晶片程式,尤其在UART接收到資料後的處理方式,也許你
就會發現問題了
最簡單的方式先傳一個Ascii Code,等UART接到一個Byte就直接給他輸出,先確定你的UART接收與輸出到LED是正確的,等Ascii code傳送OK之後,你在加強UART的功能來達到你的期望
 ex: mov p1,uartbyte
作者 : bestforever(95無鉛汽油)
[ 貼文 9 | 人氣 2743 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/2 上午 01:05:43
謝謝你的答覆,很抱歉這麼晚才回。
你給我的建議對我幫助很大,我會先試試看。在與您討論。
可否給我您才用的e-mail信箱呢。
大家都很忙,也許這樣以後連絡比較方便。
我的信箱是: iamthebestpop_e@yahoo.com.tw
謝謝!!
作者 : bestforever(95無鉛汽油)
[ 貼文 9 | 人氣 2743 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/2 上午 11:24:59
我已經檢查過ICD2板上所有的硬體架構了。都沒有問題。
您之前給我的參考範例,我也試過。LED都會亮。
現在問題來了,
假如我現在想在RS232傳值之前。先從VB介面輸入一個值。
這個值,是要比較婐傳單ㄧ值的"次數"。
例如:假設我今天都只從RS232傳出1, 我先輸入值6(n)之後,
     使能夠每隔一秒後傳出1,共傳了6次。
     也就是說,LED燈會依造我輸入的的值,顯示燈亮的"次數"。
如果是這樣的話,要怎麼做呢?
再次請教您。謝謝!!
作者 : akira49(初學者一號)
[ 貼文 16 | 人氣 1746 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/9/8 下午 02:50:00
不好意思
小弟有個拙見
只用DTREnable以及Timer
這樣來控制LED不知道這個簡單動作是不是你要的?
 板主 : 小樓
 > 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.171875