VB.NETのスマートデバイスアプリケーション開発において、シリアル通信を行うには?


ひろ  2004-06-29 23:53:34  No: 84303  IP: [192.*.*.*]

こんにちは。初めての書き込みです。よろしくお願いします。
現在、VB.NET2003のスマートデバイスアプリケーション開発で
GPSから受信したデータをPDAで受け取るようなシリアル通信の
行えるプログラムを開発中です。
デバイスのOSはWindows Mobile Pocket PC 2003です。
そのような機能を作成するにはどうしたらいいのでしょうか?
API関数を用いて行うのでしょうか?もしそうなら
PocketPC2003のOSにあるAPI関数でなにを使ったらいいのでしょうか?
それともCompact Frameworkのクラスなどを用いて実現させるのでしょうか?
デスクトップ開発でのシリアル通信のプログラムはよく見るのですが
PDA上での開発ということで、なにからしたらよいか分からず困っているところです。
どなたか、そのようなプログラムを作成したことがある方か、
知識のある方、教えていただけないでしょうか?
よろしくお願いいたします。

編集 削除
ぴろあき  2004-06-30 14:58:12  No: 84304  IP: [192.*.*.*]

#マルチポストはやめましょう。
でも、気持ちは凄くわかります。
非常に難しいです。
私もAPIを使用してゴチャゴチャやりましたが、
結局できませんでした。
PC用なら問題ないんですがね。。。

結局私は、EVB3.0を使用して作成しました。
EVB3.0には、VB.NETには無い、
Microsoft CE Comm Contorol 3.0
が使用可能ですので。。。

ただ、今でもEVB3.0が手に入るかは知りません。
当時は送料等実費のみの\2000程度でした。

#PPC2003が世に出始めた頃、
#PPC2003用のプログラムは、EVB3.0では作成できないと言われてましたが、
#PPC2003用のEVB3.0のランタイムが下記で配布されています。
#最も、完全には動作しません。
#日本語対応もしてませんしね。。。
http://www.microsoft.com/windowsmobile/resources/downloads/developer/evb.mspx

Windows CE FANの、
開発初心者の館
開発者向け談話室
をググってみると色々な情報がありますよ。
発言者名 = ぴろあき
で検索すると。。。

#こちらでは、微妙に板違いかも知れませんね。

編集 削除
ぴろあき  2004-07-01 10:40:15  No: 84305  IP: [192.*.*.*]

CEでは、APIの宣言もWindows用とは全然違うんですよね。

これは余談ですが、
EVBなんて構造体も使用できないんですよ。
そのため、String宣言した変数の中に、
構造体と同じバイナリを格納したりだとか。。。

下記は、私がトライしたコードです。
ただ、このコードでは成功しませんでしたので参考までに。。。
'シリアルポートのオープン関数の定義
Private Declare Function CreateFile Lib "Coredll" Alias "CreateFileW" _
(ByVal lpFileName As String, _
ByVal dwDesiredAccess As Integer, _
ByVal dwShareMode As Integer, _
ByVal lpSecurityAttributes As Integer, _
ByVal dwCreationDisposition As Integer, _
ByVal dwFlagsAndAttributes As Integer, _
ByVal hTemplateFile As Integer) As Integer

'シリアルポートのクローズ関数の定義
Private Declare Function CloseHandle Lib "Coredll" Alias "CloseHandle" _
(ByVal hObject As Integer) As Integer

'シリアルポートの設定関数の定義
Private Declare Function SetCommState Lib "Coredll" Alias "SetCommState" _
(ByVal hCommDev As Integer, ByVal lpDCB As DCB) As Integer

'タイムアウトの設定関数の定義
Private Declare Function SetCommTimeouts Lib "Coredll" Alias "SetCommTimeouts" _
(ByVal hFile As Integer, _
ByVal lpCommTimeouts As COMMTIMEOUTS) As Integer

'データの送信関数の定義
Private Declare Function ReadFile Lib "Coredll" Alias "ReadFile" _
(ByVal hFile As Integer, _
ByVal lpBuffer As String, _
ByVal nNumberOfBytesToRead As Integer, _
ByVal lpNumberOfBytesRead As Integer, _
ByVal lpOverlapped As Integer) As Integer

'データの受信関数の定義
Private Declare Function WriteFile Lib "Coredll" Alias "WriteFile" _
(ByVal hFile As Integer, _
ByVal lpBuffer As String, _
ByVal nNumberOfBytesToWrite As Integer, _
ByVal lpNumberOfBytesWritten As Integer, _
ByVal lpOverlapped As Integer) As Integer

' DCB構造体の定義
Private Structure DCB
Dim DCBlength As Integer
Dim BaudRate As Integer
Dim fBitFields As Short
Dim wReserved As Short
Dim XonLim As Short
Dim XoffLim As Short
Dim ByteSize As Byte
Dim Parity As Byte
Dim StopBits As Byte
Dim XonChar As Byte
Dim XoffChar As Byte
Dim ErrorChar As Byte
Dim EofChar As Byte
Dim EvtChar As Byte
End Structure

' COMMTIMEOUTS構造体の定義
Private Structure COMMTIMEOUTS
Dim ReadIntervalTimeout As Integer
Dim ReadTotalTimeoutMultiplier As Integer
Dim ReadTotalTimeoutConstant As Integer
Dim WriteTotalTimeoutMultiplier As Integer
Dim WriteTotalTimeoutConstant As Integer
End Structure

Private hComm As Integer
Private stDCB As DCB
Private timeOut As COMMTIMEOUTS
Private dummy As Integer

Const GENERIC_READ As Integer = &H80000000
Const GENERIC_WRITE As Integer = &H40000000
Const OPEN_EXISTING As Integer = 3
Const comname As String = "COM1"

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
If hComm = -1 Then
MsgBox(comname & "が使えません", vbCritical)
End If

stDCB.BaudRate = 115200
stDCB.ByteSize = 8
stDCB.fBitFields = &H3001
stDCB.Parity = 0
stDCB.StopBits = 0
dummy = SetCommState(hComm, stDCB)

timeOut.ReadIntervalTimeout = 500
timeOut.ReadTotalTimeoutMultiplier = 0
timeOut.ReadTotalTimeoutConstant = 500
timeOut.WriteTotalTimeoutMultiplier = 0
timeOut.WriteTotalTimeoutConstant = 500
dummy = SetCommTimeouts(hComm, timeOut)

編集 削除
ぴろあき  2004-07-01 10:44:53  No: 84306  IP: [192.*.*.*]

そうそう、もしかしたらCOM1をCOM1:としたら上記コードでできるかも。。。

<以下抜粋>
CEと非CEで違う点は、
1.":"は省略できない。
2.数値は1桁で最大でも"COM9:"まで。
<以上抜粋>

ちょっと実機が手元に無いので、試して結果を教えてくれると嬉しいです。

編集 削除