VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

RS232示範(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期日 八月 24, 2003 10:38 am    文章主題: RS232示範(轉貼) 引言回覆

來源:飛狐網站

[ 發表新問題 ][ 存入本文章 ] [ 有人回覆請寄一份給我 ]
[ 人氣指數 ] : 319


--------------------------------------------------------------------------------

編號 姓狐嗎? 標題 發表日期?
1 劉珍雲 有關rs232 2000/10/23 上午 10:14:15
comm1 是mscomm32 ole
接收
if !this.parent.comm1.portopen
this.parent.comm1.portopen=.t.
endif
DO WHILE .T.
this.parent.text1.value=this.parent.comm1.input
ENDDO
輸出
if !this.parent.comm1.portopen
this.parent.comm1.portopen=.t.
endif
this.parent.comm1.output=this.parent.text4.value+CHR(13)
以上程式執行時電腦似乎沒有動作why?
RS232線材已跳線分別接到PC 及Notebook
謝謝.
2 劉建成 (0)有關rs232 2000/10/24 下午 01:16:59
看了您的程式總覺得do while 迴圈好像被限制住了,無法離開do while
給你個撥號程式,自己參考吧....

Form1的 Dial 程序:
Parameter Number
DialString = "ATDT" + Number + ";" + Chr(13)
* 設置通訊埠
Thisform.Olecontrol1.CommPort = 2
* 設置波特率,奇偶校驗,數據位和停止位參數
Thisform.Olecontrol1.Settings = "9600,N,8,1"
Err = 0
On Error Err = Messagebox("無法打開通訊埠,請重新設置!",0+16,"錯誤信息")
* 打開通訊埠
Thisform.Olecontrol1.PortOpen = .T.
If Err = 1
Return
Endif
On Error
Thisform.Olecontrol1.InBufferCount = 0
Thisform.Olecontrol1.Output = DialString
FromModem = ""
StartTime = DATETIME()
Do While .T.
* 檢查連接是否過久
If DATETIME() - StartTime >= 10
= MessageBox("無法進行連接,請重新設置!",0+64,"提示信息")
Thisform.Mousepointer = 0
Thisform.Label2.Visible = .F.
Exit
Endif
Thisform.Mousepointer = 11
Thisform.Label2.Visible = .t.
If Thisform.Olecontrol1.InBufferCount > 0 Then
FromModem = FromModem + Thisform.Olecontrol1.Input
If at("OK",FromModem) > 0 Then
= MessageBox ("請先拿起話筒然後再按下‘確定’按紐!",0+64,"提示信息")
Thisform.Mousepointer = 0
Thisform.Label2.Visible = .F.
Exit
EndIf
EndIf
Enddo
* 關閉 moden 連接
Thisform.Olecontrol1.Output = "ATH" + Chr(13)
* 關閉通訊埠
Thisform.Olecontrol1.PortOpen = .F.

Form1的 Activate 程序:
Set Escape Off
Thisform.Olecontrol1.InputLen = 0

Command1(確定) 的 Click 程序:
If Empty(Thisform.Text1.Value)
= Messagebox("電話號碼不可為空白!",0+16,"提示信息")
Return
Endif
Thisform.Dial(Alltrim(Thisform.Text1.Value))

Command2(離開) 的Click 程序:
Thisform.Release


3 張崇禎 (0)有關rs232 2000/10/24 下午 01:36:10
以下是我用MSCOMM32.OCX控制讀卡機的實作,僅提供參考

WITH thisform
.Comm1.CommPort=_comport
.Comm1.PortOpen=.T.
ENDWITH
*----- 以下為持續檢查讀卡機是否備妥 -----
errfg=.F.                    && 預設檢查旗標為"無誤"
DO WHILE !errfg                && 若"無誤"繼續檢查
 thisform.Comm1.InBufferCount=0        && 先將輸入緩衝區清為空白
 thisform.Comm1.Output="RD"+CHR(13)      && 發出要讀讀卡機內卡片資料的信號
 errcount=0
 *----- 開始讀檢查碼:我自己設為兩個BYTES的檢查碼,CHR(6)和CHR(13) -----
  DO WHILE thisform.Comm1.InBufferCount<2
   IF errcount=10              && 讀了10次都未收到備妥信號
    WAIT WINDOWS "卡機讀取錯誤,"+CHR(13)+"請重新操作!"
    errfg=.T.                && 將旗標改為"有誤"
    EXIT
   ENDIF
   DOEVENTS                 && 這一行一定要,不然什麼事都不會發生
   errcount=errcount+1
  ENDDO
 *----- 讀取檢查碼完畢 -----
 Instring=thisform.Comm1.Input        && 將讀到的字從輸入緩衝區設給字串變數
 Instring1=SUBSTR(Instring,1,2)        && 取該字串的左首2字
 IF Instring1=CHR(6)+CHR(13)         && 若為預設的檢查碼則脫離本迴圈
  EXIT
 ENDIF
ENDDO
*----- 檢查讀卡機是否備妥完成 -----
IF !errfg                   && 當檢查碼正確無誤時
 stsec=SECONDS()               && 設定timeout起始值
 DO WHILE thisform.Comm1.InBufferCount<24   && 本次將讀取實際從讀卡機傳來的24字
  IF INT(SECONDS()-stsec)=5         && timeout已到5秒(可依您喜好設定)
   IF thisform.Comm1.Error(1)=2       && 請參考MSCOMM32.OCX的錯誤代碼說明
    errfg=.T.               && 將旗標改為"有誤"
    EXIT
   ENDIF
   stsec=SECONDS()             && 重設timeout起始值
  ENDIF
  DOEVENTS                  && 這一行一定要,不然什麼事都不會發生
 ENDDO
 Instring=thisform.Comm1.Input        && 將讀到的字從輸入緩衝區設給字串變數
 Instring1=SUBSTR(Instring,3,15)       && 取該字串的第3字起的15字(隨您設定)
ENDIF
WITH thisform
 .Comm1.InBufferCount=0
 .Comm1.PortOpen=.F.
ENDWITH



--------------------------------------------------------------------------------
頁次:1/1





&& THISFORM.OLECONTROL1.OUTPUT 為comm32物件's name

&&==================================================================================
&& SEND OUT DATA BY RS-232
&& PSTR = SEND DATA STRING
&& TCOUNT = SEND TIMEING
&&==================================================================================
PARA PSTR,TCOUNT
THISFORM.OLECONTROL1.OUTPUT=PSTR
T1=SECONDS()
DO WHILE THISFORM.OLECONTROL1.OUTBUFFERCOUNT > 0
IF SECONDS() - T1 >= TCOUNT
RETURN .F.
ENDIF
ENDDO
RETURN .T.

&&==================================================================================
&& RECIEVE DATA BY RS-232
&& SCOUNT = READ CHARACTER NUMBER
&& TCOUNT = READ TIMING
&& RSTR = READ RTEURN STRING
&&==================================================================================
PARA SCOUNT,TCOUNT,RSTR
T1=SECONDS()
DO WHILE THISFORM.OLECONTROL1.INBUFFERCOUNT < SCOUNT
IF SECONDS() - T1 >= TCOUNT
RSTR=THISFORM.OLECONTROL1.INPUT
RETURN .F.
ENDIF
ENDDO
RSTR=THISFORM.OLECONTROL1.INPUT
RETURN .T.

&& 個人編寫rs232小有心得,希望對你有幫助....




1.VFP MScomm 輸出程式如下:

FOR iCNO = 0 TO 255
ThisForm.Comm1.Output = CREATEBINARY(CHR(iCNO))
NEXT

2.VB 輸出程式如下:

Dim A() As Byte
A = ChrB(129)
MSComm1.Output = A

>祝您執行順利!





二進制碼接收程式如下:

OnComm EVENT:

&&====[當 OnComm EVENT 發生時,要先檢查接收緩衝區是否有資料]============
IF This.InBufferCount > 0

&&====[取得在這一次 OnComm 事件發生時,緩衝區中資料的字元(BYTE)總數]=======
iTB = This.InBufferCount

&&====[指定要從接收緩衝區中一次取多少資料]===========
This.InputLen = iTB

&&====[取出資料,放入數值型 aBDATA[] 矩陣中]===============
aBDATA = This.Input

&&====[轉為字串型式]=====================
cDATAS = ""

FOR iTT = 1 TO iTB

&&====[注意! cDATAS 是二進制文字串]=================
cDATAS = cDATAS + CREATEBINARY(CHR(aBDATA[iTT]))

NEXT

ENDIF

>RS-232 結論:
1. RS-232 ASCII > 128 的傳輸問題,是由於 VFP6 中文化的原因,在雙字元系統(DBCS)中,
VFP6 會對字串中的字元,進行中文碼合法性的檢查,規則如下:
a.執行 This.Output = CHR(129) 時會觸發中文碼合法性檢查!
b.第一字元大於 128 時,若有第二字元,但不合法時,第一字元變為 CHR(63) = "?"
c.第一字元大於 128 時,若無第二字元時,第一字元變為 CHR(0)

>>故必須使用 CREATEBINARY() 函數來避免對字串作中文碼的合法性檢查!

2.VB6 的控制項範例遠多於 VFP6 且解說詳細,應用時可以這麼想: VFP6 的方法一定比 VB6 簡單!

>>祝執行順利!

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作