|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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才會更有趣~
############################# |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|