掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
シリアル通信で受信するには? (ID:113143)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
岡田 之仁さん、ありがとうございます。 >メーカーのサイトでは、無償でダウンロード可能なソフトが配布されています。そ>れではOKか否か・・・ 一応、参考用にダウンロードしてあるのですが、やはり自分で作りたいのです。 >またハイパーターミナルとかで受信してみるとか・・ ハイパーターミナルで接続状態にしておき、電子天秤から送信ボタンを押すと受信できました。 ちなみにハイパーターミナルの設定は、 ビット/秒:2400 データビット:7 パリティ:なし ストップビット:1 フロー制御:Xon/Xoff >部分的なコードのみでは、それら受信ができないという問題 >には、そうそう答えられませんので・・・ どうもすみませんでした。まず、受信の考え方?を理解してからコードをいじっていこうと思っていたもので・・・ とりあえず現状のコードを載せます。 Module Module1 Public Structure DCB Public DCBlength As Int32 Public BaudRate As Int32 Public fBitFields As Int32 'Win32API.Txt のコメントを参照してください。 Public wReserved As Int16 Public XonLim As Int16 Public XoffLim As Int16 Public ByteSize As Byte Public Parity As Byte Public StopBits As Byte Public XonChar As Byte Public XoffChar As Byte Public ErrorChar As Byte Public EofChar As Byte Public EvtChar As Byte Public wReserved1 As Int16 '予約されています。使用しないでください。 End Structure Public Structure COMMTIMEOUTS Public ReadIntervalTimeout As Int32 Public ReadTotalTimeoutMultiplier As Int32 Public ReadTotalTimeoutConstant As Int32 Public WriteTotalTimeoutMultiplier As Int32 Public WriteTotalTimeoutConstant As Int32 End Structure Public Const GENERIC_READ As Int32 = &H80000000 Public Const GENERIC_WRITE As Int32 = &H40000000 Public Const OPEN_EXISTING As Int32 = 3 Public Const FILE_ATTRIBUTE_NORMAL As Int32 = &H80 Public Const NOPARITY As Int32 = 0 Public Const ONESTOPBIT As Int32 = 0 Public Declare Auto Function CreateFile Lib "kernel32.dll" _ (ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _ ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _ ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, _ ByVal hTemplateFile As IntPtr) As IntPtr Public Declare Auto Function GetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _ ByRef lpDCB As DCB) As Boolean Public Declare Auto Function SetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _ ByRef lpDCB As DCB) As Boolean Public Declare Auto Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _ ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean Public Declare Auto Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _ ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean Public Declare Auto Function WriteFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _ ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Int32, _ ByRef lpNumberOfBytesWritten As Int32, ByVal lpOverlapped As IntPtr) As Boolean Public Declare Auto Function ReadFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _ ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToRead As Int32, _ ByRef lpNumberOfBytesRead As Int32, ByVal lpOverlapped As IntPtr) As Boolean Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean Public Class clsCashdeskCtrl Private Success As Boolean Private Buffer() As Byte 'Private Buffer As Object Private hSerialPort As IntPtr Private BytesWritten, BytesRead As Int32 Public Sub COMPortOpen2() Dim MyDCB As DCB Dim MyCommTimeouts As COMMTIMEOUTS 'ポートのオープン(多分・・・) hSerialPort = CreateFile("COM3", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero) 'シリアル通信の設定 MyDCB.BaudRate = 2400 MyDCB.ByteSize = 7 MyDCB.Parity = NOPARITY MyDCB.StopBits = ONESTOPBIT ' MyDCB のプロパティを基に COM3 を再構成します。 Success = SetCommState(hSerialPort, MyDCB) 'タイムアウトの設定 MyCommTimeouts.ReadIntervalTimeout = 0 MyCommTimeouts.ReadTotalTimeoutConstant = 0 MyCommTimeouts.ReadTotalTimeoutMultiplier = 0 MyCommTimeouts.WriteTotalTimeoutConstant = 0 MyCommTimeouts.WriteTotalTimeoutMultiplier = 0 ' MyCommTimeouts のプロパティを基に、タイムアウトの設定を再構成します。 Success = SetCommTimeouts(hSerialPort, MyCommTimeouts) BytesWritten = 100 End Sub Public Sub receive() 'ポートからのデータの読み取り Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero) Do While BytesRead = 0 System.Windows.Forms.Application.DoEvents() Loop MsgBox("read") End Sub Protected Overrides Sub Finalize() 'ポートへのハンドルの解放 Success = CloseHandle(hSerialPort) MyBase.Finalize() End Sub End Class Public Class flmMain Inherits System.Windows.Forms.Form Private cCashdesk As clsCashdeskCtrl Private Sub flmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cCashdesk = New clsCashdeskCtrl Call cCashdesk.COMPortOpen2() End Sub Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click Call cCashdesk.receive() End Sub の様にフォームロード時にポートを開き、ボタンを押して受信待ち受け状態にしようとしています。 お手数かけて申し訳ありませんが、何か気づいたことがあったらまたお願いします。 GotDotNetのサンプルは最初にダウンロードしてあったのですが英語のサイトだったので他を探しに行ってしまいました。これから見てみます。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.