[分享]簡易RS-232介面解說與VB操作法

版主: 總版面管理員實習版面管理員

回覆文章
頭像
sppmg
一級會員
一級會員
文章: 260
註冊時間: 2004-01-10 12:41 PM
來自: 地球ㄉ台灣ㄉ台北
聯繫:

[分享]簡易RS-232介面解說與VB操作法

文章 sppmg »

抱歉讓大家久等了,一直沒時間打(也懶的打........)

其中的一些文章不是我打的,我也忘記是從哪找出來的了。
我解說重點在9Pin的RS-232。


基本概念
ASCII與Binary
每部電腦至少都有二個串列埠供我們使用,也就我們常說的COM1、COM2,這二個串列埠通常用來接滑鼠及數據機;串列埠的腳位有二種型式,一種是9Pin,另一種則是25Pin,通常滑鼠用的是9Pin,而數據機則是用25Pin;那麼這兩種腳位是不是不一樣呢?其實這兩種腳位是一樣的,它們之間可以透過跳線的方式作轉換,至於到底要用的是那一種腳位,並沒有一定的定論,那一樣都可以,您高興就好。當然,如果您使用的設備是9Pin的,那就得用9Pin的接頭了。

另外,串列埠在您電腦後面所看到的一定是公頭(也就是有9支針在上面),因此您要接出來時,一定得拿個母頭來接。

最早的串列通訊是拿來給數據機(Modem)使用的,因此它的腳位定義也和數據機有關,其定義如下:

Pin 1: DCD- Data Carrier Detect
Pin 2: RXD- Recive Data
Pin 3: TXD- Transmit Data
Pin 4: DTR- Data Terminal Ready
Pin 5: GND- Signal Common
Pin 6: DSR- Data Set Ready
Pin 7: RTS- Request to Send
Pin 8: CTS- Clear to Send
Pin 9: RI- Ring Indictor
數據機與電腦透過這9支腳就可以達到通訊的目的,進而作兩端的資料傳輸與控制。

至於其它的控制系統應用,其實都脫離不了這9支腳位的應用,甚至有時只要3支腳位就可以達到控制的功能了,當然這還得看所用到的控制設備是屬於那一種而定了。

因此最簡單的3支腳就是第2腳、第3腳以及第5腳,這3支腳分別用來接收、傳送與接地。而較先進的RS-485模組設計通常也是用到這3支腳,與以前的設計有一些不一樣的地方。

RS-232的電壓準位與TTL不同,所以通常在作控制的時候需要作準位轉換,這個部份就交給一個Chip來作就可以了。

各位可以想想,我們生活的周遭是否有相當多的設備都具有RS-232的連接介面?為什麼RS-232這麼受到廠商的採用呢?原因就在於它在實作上比起其它的介面都要來得簡單。


解說:最少要用到三支腳,上面也說了,就是RXD、TXD、GND。這裡將GND稱為「接地」,大家別把它和電器接地的那個接地混為一談了,簡單的說,這裡的接地就像是電器的負極一樣,而正極則是RXD或TXD。更正確的說,GND只是電壓零位點而已。
介面中有所謂的「準位」,以準位值區分位元0,1值。這裡我以 RS-232-C 標準說明:
-------------------------------------------------------------------
功能 範圍 代表位元
-------------------------------------------------------------------
輸出 +15V ~ +5V 0
-5V ~ -15V 1
輸入 +15V ~ +3V 0
-3V ~ -15V 1
(位元=0稱低準位,位元=1稱高準位)
---------------------------------------
這表顯示的範圍是指第2腳、第3腳與第5腳的電壓差,
例如:
GND=0V,RXD=+7V表示機器所收到的位元值為0 (注1)
GND=+15V,RXD=+3V表示機器所收到的位元值為1(RXD-GND=-12V)
而+3V~-3V之間則是雜訊區,用來區分訊號。




※哈電族的傳輸線只有三條線,看來就是這三條啦!
不過我試過用VB傳輸資料,可惜的是我只有成功下載資料,上傳還沒成功。


下面寫用VB操控的方法,其中所需的元件──"MSComm控制項"是VB普通版所沒有的。

屬性 簡要說明
---------------------------------------------------------------------------
CommPort 指定所要使用的通訊埠號碼,從1開始,文件中說最高可以到達16???
PortOpen 開啟或關閉串列通訊埠。使用前將它設成True,使用後設成False。
Settings 參數設定,共四個,依次是BaudRate、Parity、Data Bits、Stop Bit。
Input 將對方傳至通訊埠的字元讀進來。(在此之前的字元已在Buffer中了)
Output 將所要傳輸的字元送出去。
RThreshold 設定通訊事件中的接收事件發生的門檻。
InputMode 設定對方所傳送的字元是文字或是二位元的資料。這二種資料格式有部份差異存在,在傳輸時須特別注意

重點有以下數點:

各個屬性的使用要注意其先後順序,在PortOpen屬性設成True 之前,必須將Settings的參數先設定完成。
InputMode須設定正常,若設成Text Mode而要去讀取Binary 的資料,將會發生錯誤。
Output指令是將所設定的字元變數傳送出去,但若要傳送ASCII 128以上的字元時,必須使用Byte的變數型態才行。
 ASCII是我們一般使用MSComm控制項最常用到的格式,它相對應的屬性是 InputMode。

在工業應用上,PLC是我們最常用的設備,它在與電腦之間的傳輸是以ASCII碼編號128以下為主,這些碼的前幾個是控制碼,而其它的則是可見字元。PLC的通訊協定中就是以控制碼加上其它的字元來傳輸資料。

但是在有的時候,儀器(尤其是歐美貨)傳輸的資料會含有二位元的資料,所謂二位元的資料是因所傳的字元碼會超過128,這超過128 以上的字元傳到我們的電腦時,我們在通訊元件上的設定要改成Binary 才可以接收到對方所傳送過來的資料,我們也才有辦法對所傳送過來的資料作解讀。

這兩種型態的決定屬性就是InputMode。

 
[VB的串列通訊元件]

自從VB出現以後,程式設計師突然多了起來,其原因乃是VB的簡易所致,所以您可以在不必學習SDK、 DDK的情形下就可以寫出視覺化的視窗程式 ,這是它能在短時間內就席捲市場的原因。微軟在VB對外的通訊方面,提供了MSComm控制項給工程師使用;此控制元件專門用來控制串列通訊設備,對電腦來說當然就是串列通訊埠了。 透過串列通訊埠的功能,我們可以拿來控制相當多的儀器或是設備,我們就來看看VB到底是如何拿來控制串列通訊埠的吧!

首先,我們可以由VB5.0的主畫面中,找到「專案\設定使用元件…」並選擇它,接著畫面會出現使用元件的交談視窗,請勾選「MicroSoft Comm Control 5.0」此項,部份使用者因為作了SP2或SP3的更新,所以可能出現 SP2的字眼,勾選後回到主畫面中。
您會在畫面中看到有一個類似電話盒的小Icon出現在工具箱中,這個小Icon就是MSComm控制項,我們要作的串列通訊控制工作就是要靠它了。
接著在表單上安排此一控制物件,畫面上將會出現一個電話盒,代表我們已經將物件嵌入我們的程式中了,請在屬性視窗中給它一個名字,這個名字將是我們在程式所要使用的名字。
在屬性視窗中給定這個物件一些屬性設定,比方說通訊埠號碼(CommPort)、交握協定(HandShaking)、通訊設定(Setting)等等;這些設定還請參您所使用的硬體來作設定。
該作的設定設好之後,接下是開啟通訊埠(MSComm1.PortOpen=True)。
您已經可以透過串列通訊埠作輸出或輸入的工作了。
作完之後,記得執行MSComm1.PortOpen=False來關閉通訊埠。

[PC與Modem]

RS485串列通訊用得相當多及相當早的就是用在數據機上面,它的主要工作就是將地處兩端的遠方電腦或機器作連接,並把資料在雙方之間作傳送的工作。

首先在表單上安排一個電話盒(也就是MSComm32.OCX),接下來在程式的地方對串列通訊埠下命令,並與Modem作溝通,其完整的程式碼如下:

Private Sub Form_Load ()
Dim Instring As String ' 儲存輸入字串的暫存區
MSComm1.CommPort = 2 ' 使用 COM1.
MSComm1.Settings = "19200,N,8,1" ' 連線速度 19200 baud、無同位檢查、資料位元 8、停止位元 1
MSComm1.InputLen = 0 ' 告訴控制項當使用 Input 時,讀取整個暫存區
MSComm1.PortOpen = True ' 開啟連接埠,準備作串列通訊
MSComm1.Output = "AT" + Chr$(13) ' 將 attention 指令送到數據機

Do
DoEvents
Loop Until MSComm1.InBufferCount >= 2 ' 等待資料傳回到連接埠,若正常,數據機會送回OK字碼

Instring = MSComm1.Input ' 從連接埠讀取 "OK" 回應資料
MSComm1.PortOpen = False ' 關閉連接埠,結束通訊埠的使用
End Sub

若還要作其他的命令控制,則在 MSComm1.PortOpen = True與MSComm1.PortOpen = False之間將命令填寫進去即可。









這篇文章大致是正確的啦!
可能在一些細微的定義上有些錯誤,不過,管他這麼多,能用就好啦!!(知道的還是幫忙糾正一下吧!)


這資料我認為功用很大,成功控制哈電族io後,可以任意上下傳資料,甚至於將哈電族當作電源供應器(我想接超亮led....)。
對岸還做到直接控制哈電族cpu,不過這實在超出我能力太多了,完全想不出如何做到。
加油!研究吧!







註解集:
1.RS-232晶片中有個石英震盪器,他會控制位元切換速率,想像你在家將燈開開關關的,並規定每過一秒相當於跳下一個發送訊號,如:亮暗暗暗暗暗亮亮暗亮暗亮......(當然,"暗暗暗暗暗"這段你直接一直關著就好)
好久沒完6502了
也沒時間......
目前除了拼課業就是玩Linux(還說沒時間......)
Syungchi
會員
會員
文章: 15
註冊時間: 2013-03-25 12:07 AM

文章 Syungchi »

感謝大大的分享~~

在玩積體電路

其實不外乎就是記憶體的管理

及IO的控制~RS232就是新手入門最簡單的練習對象了!
回覆文章