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

請問有關MSComm物件問題

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



註冊時間: 2003-08-25
文章: 16


第 1 樓

發表發表於: 星期三 四月 10, 2013 5:58 pm    文章主題: 請問有關MSComm物件問題 引言回覆

公司有套用VFP3寫的程式

因為客戶端的電腦系統改為XP(原先是Win98)

XP無法安裝VFP3,所以改用VFP6重新編譯

但發覺MSComm(com port)物件無法正常運作

請教各位先進,想問VFP3跟VFP6的MSComm物件有差別嗎?
回頂端
檢視會員個人資料 發送私人訊息
chuander



註冊時間: 2003-08-25
文章: 16


第 2 樓

發表發表於: 星期一 四月 15, 2013 9:46 am    文章主題: 引言回覆

從VFP3轉換至VFP6程式完全沒有變更的情況下~~

納悶的是查門禁主機內有幾筆子卡總數的指令(card_sum)又沒問題。

但開門指令(OpenDoor)或其他指令幾乎都有問題?


Oleobject = C:\Windows\system32\MSCOMM32.OCX
BaseControl:OleControl
OleClass:MSCOMMLib.MSComm.1




* 執行開門動作 ***********************************************
Procedure OpenDoor
Lparameters nAddr_No, nDoor_No
Private cCmd, cData

cCmd = 'MM1' + Alltrim( Str( nDoor_No))
If .Not. This.PortOpen
This.PortOpen = .T.
Endif
This.Send( nAddr_No, cCmd)
cData = This.Recv()
This.PortOpen = .F.

If cData # 'G'
= Messagebox( '對 SC-202A 通訊有問題,請查明。' + Chr( 13) + '錯誤說明:' + cData, 64, '錯誤')
Return .F.
Endif
Return .T.
Endproc




* 取得已設定之子卡總數 ***********************************************
Procedure card_sum
Lparameters nAddr_No

Private cCmd, cData

cCmd = 'BB1'

If .Not. This.PortOpen
This.PortOpen = .T.
Endif
This.Send( nAddr_No, cCmd)
cData = This.Recv()
This.PortOpen = .F.

If Len( cData) # 4
= Messagebox( '對 SC-202A 通訊有問題,請查明。' + Chr( 13) + '錯誤說明:' + cData, 64, '錯誤')
Endif
Return cData
Endproc




* 傳送門禁指令 ***********************************************
Procedure Send
Lparameters nId, cStr

Private cAdr1, cAdr2
Private nLen, nLoop
Private nTmp, cBuf
Private nChkSum1, nChkSum2

cBuf = cStr

&& 設定欲傳送之門禁工作站編號
cAdr1 = Chr( nId)
cAdr2 = Chr( nId + 64)

&& 資料轉碼
nLen = Len( cBuf)
For nLoop = 1 To nLen
nTmp = Asc( Substr( cBuf, nLoop, 1))
nTmp = nTmp + 96
cBuf = Stuff( cBuf, nLoop, 1, Chr( nTmp))
Next
cBuf = cAdr1 + cAdr2 + cBuf

&& 計算檢查碼
nLen = Len( cBuf)
nChkSum1 = Asc( Left( cBuf, 1))
For nLoop = 2 To nLen
nChkSum2 = Asc( Substr( cBuf, nLoop, 1))
nChkSum1 = Bitxor( nChkSum1, nChkSum2)
Next

nChkSum1 = Bitand( nChkSum1, 63)
nChkSum1 = Bitor( nChkSum1, 192)

&& 組合傳送字串
cBuf = cBuf + Chr( nChkSum1)

&& 開始傳送
This.Output = cBuf
Return .T.
Endproc



* 接收門禁主機回傳資料 **************************************
Procedure Recv
Private nSec
Private cBuf
Private nTmp
Private nLen
Private cData
Private nLoop
Private nChkSum1, nChkSum2

nSec = Seconds()
cBuf = Space(0)

nTmp = 0
Do While .T.
cBuf = cBuf + This.Input
nLen = Len( cBuf)
For nLoop = nLen To 1 Step -1
If Substr( cBuf, nLoop, 1) == Chr( 13) .And. nLoop < nLen
nTmp = nLoop
Exit
Endif
Next
If nTmp # 0
cBuf = Substr( cBuf, 1, nTmp + 1)
Exit
Endif
If Seconds() - nSec = 2 && 設定讀取 Time Out 時間為 2 秒
Return 'TIME OUT'
Endif
Enddo

&& 尋找第一個 SOH -- CHR( 1)
nTmp = 0
nLen = Len( cBuf)
For nLoop = 1 To nLen
If Substr( cBuf, nLoop, 1) == Chr( 1)
nTmp = nLoop
Exit
Endif
Next
If nTmp = 0
Return 'SOH ERROR 1'
Endif

cBuf = Substr( cBuf, nTmp)
If Left( cBuf, 3) # Chr( 1) + Chr( 1) + Chr( 1)
Return 'SOH ERROR 3'
Endif

nTmp = Len( cBuf)
cData = Substr( cBuf, 4, nTmp - 5) && 取出資料內容

&& 計算檢查碼
nChkSum1 = Asc( Left( cData, 1))
nTmp = Len( cData)
For nLoop = 2 To nTmp
nChkSum2 = Asc( Substr( cData, nLoop, 1))
nChkSum1 = Bitxor( nChkSum1, nChkSum2)
Next
nChkSum1 = Bitxor( nChkSum1, 13)
nChkSum2 = Asc( Right( cBuf, 1))

If nChkSum1 # nChkSum2
Return 'CHECK SUM ERROR'
Endif
Return cData
Endproc
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 3 樓

發表發表於: 星期一 四月 15, 2013 1:59 pm    文章主題: 引言回覆

會不會是電腦運算速度變快, 而你送出RS232指令後太快去檢查是否有回送訊息的關係,
你試著加一個 inkey(3) 等3秒後才去執行下一個動作
例:
This.Send( nAddr_No, cCmd)
inkey(3) &&--可調整增加等待時間不一定要3秒
cData = This.Recv()

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
chuander



註冊時間: 2003-08-25
文章: 16


第 4 樓

發表發表於: 星期三 四月 17, 2013 11:18 am    文章主題: 引言回覆

garfield 寫到:
會不會是電腦運算速度變快

有試著在舊主機Win98上安裝VFP6(其實是將開發程式用複製方式到主機),但結果還是一樣~

garfield 寫到:
你試著加一個 inkey(3) 等3秒後才去執行下一個動作


這個方式我同樣也有做過了,但結果還是一樣Time Out Crying or Very sad

另外在Recv有延長時間∼
Seconds() - nSec = 2秒 改成 5秒
發生當機∼ Shocked


可以請教DOEVENTS使用時機嗎?
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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