Pocket PC串口调试程序和代码(EVC、VB.NET、C#版合辑)
串行接口是目前没有被淘汰的低速接口之一,在很多应用还是比较广泛的。这是EVC版,将串口操作封装成一个类,在做其他应用程序可以直接使用这个类。
以后会将同样功能的C#和VB.NET版本程序也发上来。
[[i] 本帖最后由 MacintoshM 于 2006-7-7 02:20 PM 编辑 [/i]] 对应的PC版,在VC6.0下可以编译。
VB.NET版串口调试程序
今天上午停电,没去教室自习!就做了这个程序,把本本的电用了一半。:P在VS.NET 2003下调试通过。
这里只做了打开COM1的功能,波特率什么也是固定的了。给需要做开发的朋友做个参考。呵呵
以后我会慢慢完善的。
首先要Import串口操作的函数
<DllImport("coredll.dll")> _
Private Shared Function CreateFile _
(ByVal lpFileName As String, _
ByVal dwDesiredAccess As Integer, _
ByVal dwShareMode As Integer, _
ByVal lpSecurityAttributes As Integer, _
ByVal dwCreationDisposition As Integer, _
ByVal dwFlagAndAttributes As Integer, _
ByVal hTemplateFile As Integer) As Integer
End Function
<DllImport("coredll")> _
Private Shared Function ReadFile _
(ByVal hFile As Integer, _
ByVal Buffer() As Byte, _
ByVal nNumberOfBytesToRead As Integer, _
ByRef lpNumberOfBytesRead As Integer, _
ByRef lpOverlapped As Integer) As Integer
End Function
<DllImport("coredll")> _
Private Shared Function WriteFile _
(ByVal hFile As Integer, _
ByVal Buffer() As Byte, _
ByVal nNumberOfBytesToWrite As Integer, _
ByRef lpNumberOfBytesWritten As Integer, _
ByVal lpOverlapped As Integer) As Boolean
End Function
<DllImport("coredll")> _
Private Shared Function CloseHandle _
(ByVal hObject As Integer) As Integer
End Function
最重要的函数是这些
Public Sub openPort()
Dim ioPort As Short = 1
inoutfileHandler = CreateFile _
("COM" & ioPort & ":", _
&HC0000000, 0, 0, 3, 0, 0)
Application.DoEvents()
stopThread = False
t1 = New Threading.Thread _
(AddressOf receiveLoop)
t1.Start()
End Sub
Public Function send(ByVal message As String) _
As Integer
Dim value As String = message & vbCrLf
Dim retCode As Integer = WriteFile _
(inoutfileHandler, _
stringToByteArray(value), _
value.Length(), _
numReadWrite, _
0)
Return retCode
End Function
Public Sub closePort()
stopThread = True
CloseHandle(inoutfileHandler)
End Sub
使用一个receiveLoop来持续接收
Public Sub receiveLoop()
Dim inbuff(300) As Byte
Dim retCode As Integer = ReadFile _
(inoutfileHandler, _
inbuff, _
inbuff.Length, _
numReadWrite, _
0)
Application.DoEvents()
While True
If retCode = 0 Or stopThread Then
Exit While
Else
Dim updateDelegate As New _
myDelegate _
(AddressOf displayReceivedMessage)
updateDelegate.Invoke _
(byteArrayToString(inbuff))
ReDim inbuff(300)
retCode = ReadFile(inoutfileHandler, inbuff, inbuff.Length, numReadWrite, 0)
Application.DoEvents()
End If
End While
End Sub 太谢谢楼主了,希望关于vb.net操作ppc串口的程序能更详细,注释也更丰富。
太谢谢了 更新啦,可以调整波特率了,其他参数修改dcb中对应的变量就可以。具体参见MSDN。
Import进SetCommState和GetCommState函数就可以了。呵呵
等我考完试,就写个详细的说明上来! 楼主能不能给点vb.net 操作ppc串口的资料看看,我英语不行的
谢谢 顶一下
C#版串口调试程序
发现微软给的那个例子不使很好用,仿照VB.NET(其实也是MS给的:P),做了这个,觉得还不错。C#开发真是快,比C++快多了,但感觉自己不是在写程序,而是在使用别人已经给好的框架,还是C++来的实在些。呵呵
To Openext:中文的说明只有等放寒假写了,手头还有两个活要做呢!不好意思啦!呵呵
BTW:现在.NET下的版本没在界面上增加设置的功能,以后我再改吧!
to macintoshm
中文的说明说寒假在写,我可等着呢 赞啊赞同等中文说明
VB.NET操作串口的说明
Pocket PC使用VB.NET操作串口的说明首先,从coredll.dll中导入下列函数,其中有文件读写的函数例如CreateFile、ReadFile、WriteFile以及CloseHandle,分别用来打开、读、
写和关闭文件。因为在WinCE中,使用API操作串口的话,串口是当作一个文件来处理的。另外主要要用的就是GetCommState和SetCommState,
用来获取和设置串口的状态,例如波特率,数据位,停止位,奇偶校验等等。以下是导入这些函数的语句。
<DllImport("coredll.dll")> _
Private Shared Function CreateFile _
(ByVal lpFileName As String, _
ByVal dwDesiredAccess As Integer, _
ByVal dwShareMode As Integer, _
ByVal lpSecurityAttributes As Integer, _
ByVal dwCreationDisposition As Integer, _
ByVal dwFlagAndAttributes As Integer, _
ByVal hTemplateFile As Integer) As Integer
End Function
<DllImport("coredll.dll")> _
Private Shared Function GetCommState _
(ByVal hFile As Integer, _
ByVal mdcb As dcb) As Integer
End Function
<DllImport("coredll.dll")> _
Private Shared Function SetCommState _
(ByVal hFile As Integer, _
ByVal mdcb As dcb) As Integer
End Function
<DllImport("coredll.dll")> _
Private Shared Function ReadFile _
(ByVal hFile As Integer, _
ByVal Buffer() As Byte, _
ByVal nNumberOfBytesToRead As Integer, _
ByRef lpNumberOfBytesRead As Integer, _
ByRef lpOverlapped As Integer) As Integer
End Function
<DllImport("coredll.dll")> _
Private Shared Function WriteFile _
(ByVal hFile As Integer, _
ByVal Buffer() As Byte, _
ByVal nNumberOfBytesToWrite As Integer, _
ByRef lpNumberOfBytesWritten As Integer, _
ByVal lpOverlapped As Integer) As Boolean
End Function
<DllImport("coredll.dll")> _
Private Shared Function CloseHandle _
(ByVal hObject As Integer) As Integer
End Function
另外,需要定义一个dcb结构体,用来存储串口的状态。
Public Class dcb
Friend DCBlength As UInt32
Friend BaudRate As UInt32 波特率
Friend fBinary As UInt32
Friend fParity As UInt32
Friend fOutxCtsFlow As UInt32
Friend fOutxDsrFlow As UInt32
Friend fDtrControl As UInt32
Friend fDsrSensitivity As UInt32
Friend fTXContinueOnXoff As UInt32
Friend fOutX As UInt32
Friend fInX As UInt32
Friend fErrorChar As UInt32
Friend fNull As UInt32
Friend fRtsControl As UInt32
Friend fAbortOnError As UInt32
Friend fDummy2 As UInt32
Friend wReserved As UInt32
Friend XonLim As UInt32
Friend XoffLim As UInt32
Friend ByteSize As Byte 数据位
Friend Parity As Byte 奇偶校验
Friend StopBits As Byte 停止位
Friend XonChar As Char
Friend XoffChar As Char
Friend ErrorChar As Char
Friend EofChar As Char
Friend EvtChar As Char
Friend wReserved1 As UInt16
End Class
以上只标注了主要的参数,其他参数可以依据需要进行查看,包含一些控制和读取Modem状态的参数等等。
1.打开串口
CreateFile(文件名,读写方式,共享模式,安全属性,对文件是否已存在的处理,文件属性以及标记,模板文件)
该函数如果打开成功,将返回一个已经打开的文件的句柄,可以使用这个句柄对文件进行其他操作。
在WinCE中,第四个参数是忽略了的。其他的数值在处理文件的时候会依据需要有所不同,处理串口则使用一种参数就基本可以。
打开串口,用这样的语句就可以了
CreateFile ("COM1:", &HC0000000, 0, 0, 3, 0, 0)
2.设置串口参数
使用GetCommState和SetCommState函数
因为dcb这个结构体定义的变量的初始值和当前串口的参数是不同的,我们修改串口参数并不希望将不需要的参数也改动,甚至是改错.所以先用
GetCommState将当前串口状态读入这个变量,然后再选择需要的参数进行修改,并用SetCommState设置回去。
示例如下:
'设置波特率为115200
GetCommState(inoutfileHandler, pdcb)
pdcb.BaudRate.Parse("115200")
SetCommState(inoutfileHandler, pdcb)
第一个参数是已经打开的串口的句柄,第二个参数是dcb(设备控制设置变量)
3.从串口读数据
使用ReadFile
ReadFile(文件句柄,用来存放读取到的数据的变量,需要读取的字节数,用来存放实际读取到的字节数的变量,存放重叠参数的变量指针)
注意最后一个对文件的重叠操作是WinCE不支持的,设为0。
从串口读取数据到一个数组中,使用如下语句就可以
ReadFile (inoutfileHandler, inbuff, inbuff.Length, numReadWrite, 0)
这样的语句执行之后,inbuff中存储的就是读取到的数据,numReadWrite中就是刚才读取的字节数
4.向串口写数据
和读类似,使用WriteFile函数
WriteFile (inoutfileHandler, stringToByteArray(value), value.Length(), numReadWrite, 0)
5.关闭串口
CloseHandle(inoutfileHandler)
上面的描述可能和正规的技术描述有一定偏差,所以遇到不清楚的地方,还是查MSDN吧!我已经尽力描述清楚了。呵呵 谢谢楼主啊,可是我怎么调试不通啊,和调试助手连起来,发送接收都不对,没有任何反映,还请楼主现身 还请楼主现身啊 请问目前用EVC的程序能够通过吗?先排除硬件连接的问题。再看软件方面的。 谢谢楼主提醒,我的模拟器的端口没有设置正确,所以出现错误 还是有错误“未处理的“System.OverflowException”类型的异常出现在 mscorlib.dll 中。
其他信息: OverflowException” 大哥,你的例子中的receiveloop很容易使机器死机,想问一下有没有不用application.DoEvent事件的方法,避免重复调用 。或者有DOEvent事件的筛选事件。最好有直接的像控件一样的触发事件。希望能告知[email]jesonwang@eyou.com[/email].。。不胜感激!!! 还是没有通啊,楼主能不能、给个现成的vb.net操作串口的调通的例子???谢谢! 多谢楼主,试过EVC和C#的都可以调通,呵,
不过看明白程序还需要大量时间,
总之,多谢楼主。 这个是修改到VS2005下的工程,附图是使用这个调试MODEM的例子。