如何调用中断?急!!

tommy3310 2003-04-28 08:32:15
小弟在做一个刷卡器系统。就是刷卡器与电脑通过串口相连接。当有人在刷卡机上刷卡时,电脑能对此做出反应,执行我的一个程序。据说要调用mscomm,由于小弟以前没有接触过串口编程,对此一窍不通,还望各位大虾鼎力相助!!
...全文
45 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongyj 2003-05-06
  • 打赏
  • 举报
回复
Clea
#Define CREATE_NEW 1
#Define CREATE_ALWAYS 2
#Define OPEN_EXISTING 3
#Define FILE_ATTRIBUTE_NORMAL 128
#Define GENERIC_READ 2147483648
#Define GENERIC_WRITE 1073741824
#Define GENERIC_ALL 268435456
#Define MAXIMUM_ALLOWED 33554432
#Define STANDARD_RIGHTS_ALL 2031616
#Define FILE_SHARE_READ 1
#Define FILE_SHARE_WRITE 2
#Define FILE_SHARE_DELETE 4
#Define INVALID_HANDLE_VALUE -1
#Define SW_SHOWNORMAL 1 && 常?大小
#Define SW_SHOWMINIMIZED 2 && 最小化
#Define SW_SHOWMAXIMIZED 3 && 最大化

Declare INTEGER CreateFile IN kernel32;
STRING lpFileName,;
INTEGER dwDesiredAccess,;
INTEGER dwShareMode,;
INTEGER lpSecurityAttr,;
INTEGER dwCreationDisp,;
INTEGER dwFlagsAndAttrs,;
INTEGER hTemplateFile
Declare INTEGER CloseHandle IN kernel32 INTEGER hObject
Declare INTEGER ReadFile IN kernel32 ;
INTEGER hFile,;
STRING lpBuffer,;
INTEGER nNumberOfBytesToWrite,;
STRING lpNumberOfBytesWritten,;
INTEGER lpOverlapped


Local lpFileName,lpBuffer1,nNumberOfBytesToRead1,lpNumberOfBytesRead1,hFile1

lpBuffer1=' '
nNumberOfBytesToRead1=1
lpNumberOfBytesRead1=repl(chr(0),4)
lpFileName = "COM1"
hFile1 = CreateFile(lpFileName, GENERIC_WRITE,;
FILE_SHARE_WRITE, 0, OPEN_EXISTING,;
FILE_ATTRIBUTE_NORMAL, 0)
?hFile1
If hFile1 <> INVALID_HANDLE_VALUE
*下面三行代碼可以放在循環中
? ReadFile(hFile1,@lpBuffer1,nNumberOfBytesToRead1,@lpNumberOfBytesRead1,0)
? lpNumberOfBytesRead1
? lpBuffer1
= CloseHandle (hFile1)
Endif
Clear DLLs
return
tommy3310 2003-05-05
  • 打赏
  • 举报
回复
谢谢大虾!!:)
数据从串口通过时,就会触动timer控间么?还有,原本通过的数据就被另一个系统所调用,就是说,串口通过的数据是有用的。被上面的readfile读了之后,会不会导致那些数据缺失?
tommy3310 2003-04-30
  • 打赏
  • 举报
回复
谢谢大虾!!:)
数据从串口通过时,就会触动timer控间么?还有,原本通过的数据就被另一个系统所调用,就是说,串口通过的数据是有用的。被上面的readfile读了之后,会不会导致那些数据缺失?
zhongyj 2003-04-29
  • 打赏
  • 举报
回复
另外可以通過Win32 API寫底層類庫來實現,其中包括
CreateFile 打開COM1口,
ReadFile 从COM1口中读出数据,當然你必須把這個函數加在一個循環中.

下面這個鏈接有一個調用API的例子,你可以參考
http://expert.csdn.net/Expert/topic/1715/1715011.xml?temp=.7314722

zhongyj 2003-04-29
  • 打赏
  • 举报
回复
使用timer控件,時間事件發生時就從com1口讀取數據,如果ReadFile
函數返回非零值,代表讀取成功,lpBuffer會保存讀入的數據
BOOL ReadFile(
HANDLE hFile, // handle to file
LPVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPED lpOverlapped // overlapped buffer
);
tommy3310 2003-04-29
  • 打赏
  • 举报
回复
先对上面的大虾表示感谢。
我只是想:当有数据从串口通过时能触发我的程序,这就行了。请问如何实施??谢谢
hnpyz 2003-04-28
  • 打赏
  • 举报
回复
我记得网上有现成的读磁卡阅读器的程序。搜索一下就可以找到。记得有 2磁道和 3 磁道两种格式。
marki 2003-04-28
  • 打赏
  • 举报
回复
*很久前VB寫的一個程序,供參考
*只簡單的從COM口讀取電話記錄,
*生成文本文件
Option Explicit
' 終止讀取通訊埠的指標
Dim bstop As Boolean
' 讀取通訊埠的暫存區
Dim InString As String
Dim tmpinstr As String
'聲明一個檔系統物件變數
Dim fso

Private Sub Command1_Click()
'text1是否有資料的指標
Dim lbltag As Boolean
'上一條記錄
Dim strprevious As String

strprevious = ""
Command3.Enabled = True
Command2.Enabled = True
Command1.Enabled = False
bstop = False
With MSComm1
' 設定通訊埠號
.CommPort = 1
' 設定傳輸速率等
.Settings = "9600,N,8,1"
' 將通訊埠打開
.PortOpen = True
End With
Label1.Caption = " a minute please..."
lbltag = False

' 假如使用者未按下「停止測試」鈕(bStop = False)
Do While Not bstop
If MSComm1.InBufferCount Then
' 通訊埠中假如有資料的話, 則讀取進來
InString = InString & MSComm1.Input
' 如果資料中有 Chr(13) 和 Chr(10) 的話, 則顯示出來
If InStr(InString, vbCrLf) Then
If Not lbltag Then
lbltag = Not lbltag
Label1.Caption = " 日 期 時 間 分機 外線 撥打號碼 計 時 帳號 TX/RX "
End If
text2.Text = text2.Text & InString
text1.Text = InString & text1.Text
InString = ""
DoEvents
End If
End If
DoEvents
Loop
End Sub

Private Sub Command2_Click()
' 按下鈕時, 把 bStop 設為True
' 如此程式才會停止等待(或讀取)通訊埠所收到的資料
bstop = True
Label1.Caption = ""
Command1.Enabled = True
Command2.Enabled = False
MSComm1.PortOpen = False
End Sub

Private Sub Command3_Click()
Call DataSaving
End Sub

Private Sub Command4_Click()
'Call dataInput
End Sub

Private Sub Form_Load()
Dim i As Integer
text1.Text = ""
text2.Text = ""
Label1.Caption = ""
'Text1.Text = "03/11/03 04:16PM 206 01 <INCOMING> 00:02'01 "
'Text1.Text = Text1.Text & vbCrLf & "03/11/03 04:21PM 103 05 <INCOMING> 00:02'44 TR"
'Text1.Text = Text1.Text & vbCrLf & "03/11/03 04:23PM 209 03 577900718154 00:00'55 "
Command3.Caption = "SaveAs(&S)"
Command2.Caption = "Stop(&P)"
Command1.Caption = "Start(&B)"
Command4.Caption = "Output...(&I)"
MSComm1.DTREnable = -1 'True
Command2.Enabled = False
Command3.Enabled = False
Command4.Enabled = False
'創建檔系統物件實例
Set fso = CreateObject("scripting.filesystemobject")
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
bstop = True
'把通訊埠關閉 , 才不會影響其他程式的使用通訊埠
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End
End Sub

'將串列讀入的資料寫入一個文字檔案
Private Sub DataSaving()
Dim fl
Dim num As String
Dim dt As Date
Dim count '欲存檔的文字檔案序號
Dim counta '現有文檔的下一個序號
Dim fname As String '存檔的檔案名
Const forWriting = 2
Const forReading = 1

On Error GoTo errhandler:
'查找e:\tellist目錄,沒有的話,則建立一個
If Not fso.FolderExists("e:\tellist") Then
fso.CreateFolder "e:\tellist"
End If

'將可用的下一個文檔序號取出
If fso.FileExists("E:\telList\counter.txt") Then
Set fl = fso.OpenTextFile("E:\telList\counter.txt", forReading, True)
num = Trim(fl.ReadLine)
dt = CDate(Left(num, 8))
count = CInt(Right(num, 3))
If Date > dt Then
count = 1
End If
fl.Close
Else
count = 1
dt = Date
End If

'count 值加一作為下一個序號
counta = count + 1
'為檔案名和counter.txt文件準備序號字串
count = String(3 - Len(CStr(count)), "0") & CStr(count)
counta = String(3 - Len(CStr(counta)), "0") & CStr(counta)

Set fl = fso.CreateTextFile("e:\telList\counter.txt", True)
fl.WriteLine Date & "-" & counta
fl.Close

fname = "E:\telList\" & Format(Date, "yyyy-mm-dd") & "-" & count & ".txt"
Set fl = fso.CreateTextFile(fname, True)
fl.Write text2.Text
fl.Close
text1.Text = ""
text2.Text = ""
Set fl = Nothing
MsgBox "Data been saved as " & fname, vbOKOnly, "Information"

Exit Sub
errhandler:
MsgBox Err.Description
Resume Next

End Sub



2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧