質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

1326閲覧

VBAを用いてシリアル通信にて2行目以降のデータを受信したい

tista504

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/10/17 07:33

質問

機械の中にあるデータをVBAとシリアル通信 (RS232C) を用いてExcelに流したいのですが、1行目のデータしか受信することができません(改行された2行目以降のデータが取得できません)。
どのようにすれば改行以降のデータも取得することができるのでしょうか。
正直、シリアル通信を詳しく理解できておらず、現在勉強している最中です。
分かりやすく教えて頂けると助かります。
よろしくお願い致します。

該当のソースコード

VBE

1'WindowsAPI初期設定 2Declare PtrSafe Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal filename As String, ByVal rw As Long, ByVal d1 As Long, ByVal d2 As Long, ByVal d3 As Long, ByVal d4 As Long, ByVal d5 As Long) As Long 3Declare PtrSafe Function ReadFile Lib "kernel32" (ByVal handle As Long, ByVal buf As String, ByVal bytes As Long, ReadBytes As Long, ByVal d1 As Long) As Long 4Declare PtrSafe Function SetCommState Lib "kernel32" (ByVal handle As Long, ByRef lpDCB As DCB) As Long 5Declare PtrSafe Function SetCommTimeouts Lib "kernel32" (ByVal handle As Long, ct As COMMTIMEOUTS) As Long 6Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal handle As Long) As Long 7 8'CreateFile関数用定数 9Const GENERIC_READ = (&H80000000) 10Const GENERIC_WRITE = (&H40000000) 11 12'SetCommState関数用構造体定義 13Type DCB 14 DCBlength As Long 15 BaudRate As Long 16 bfModeCTL As Long 17 wReserved As Integer 18 XonLim As Integer 19XoffLim As Integer 20 ByteSize As Byte 21 Parity As Byte 22 StopBits As Byte 23 XonChar As Byte 24 XoffChar As Byte 25 ErrorChar As Byte 26 EofChar As Byte 27 EvtChar As Byte 28 wReserved1 As Integer 29End Type 30 31'SetCommTimeouts関数用構造体定義 32Type COMMTIMEOUTS 33 ReadIntervalTimeout As Long 34 ReadTotalTimeoutMultiplier As Long 35 ReadTotalTimeoutConstant As Long 36 WriteTotalTimeoutMultiplier As Long 37 WriteTotalTimeoutConstant As Long 38End Type 39 40Sub RS232C通信() 41 Dim cs As DCB 42 Dim ct As COMMTIMEOUTS 43 dim com as boolian 44 Dim i As Long 45 Dim l As Long 46 Dim buf As String * 16384 47 i = 1 48 49 PORT = ”COM1” 50 OP = Right(PORT, 1) 51 h = CreateFile(PORT, GENERIC_READ, 0, 0, OP, 0, 0) 52 53 '通信条件設定 54 cs.BaudRate = 9600 55 cs.ByteSize = 8 56 cs.Parity = 0 57 cs.StopBits = 0 58 a = SetCommState(h, cs) 59 60 'タイムアウト設定 61 ct.ReadIntervalTimeout = 0 62 ct.ReadTotalTimeoutMultiplier = 1 63 ct.ReadTotalTimeoutConstant = 1000 64 ct.WriteTotalTimeoutMultiplier = 1 65 ct.WriteTotalTimeoutConstant = 1000 66 b = SetCommTimeouts(h, ct) 67 68 'データ送信 69 c = ReadFile(h, ByVal buf, 10000, l, 0) 70 Cells(1, 5) = buf 71 72 'ポートクローズ:CloseHandle (ポートのハンドル) 73 com = CloseHandle(h) 74End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

現状のコードは、1行受信すると即Closehandleしてしまっているので、1行しか受信できないのはその書いてるコードのとおりになっています

c = ReadFile(h, ByVal buf, 10000, l, 0)

これを複数回繰り返しましょう

投稿2022/10/17 09:29

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tista504

2022/10/17 10:02

すみません。 古いコードを書いてしまいました。 実際はdo loop にて繰り返し計算をさせているのですが、一番最初の行を繰り返し受信し続けてしまうのです。 質問の投稿後に気づいたのですが、おそらくチェックサムが関係しているのではないかと考えています。 どのようにすればチェックサムを組み込みことができるのでしょうか。 よろしくお願い致します。
y_waiwai

2022/10/17 10:06

コードを提示しよう、としかいいようがないです
tista504

2022/10/17 12:15

現状このような感じです 'データ送信 i = 1 do c = ReadFile(h, ByVal buf, 10000, l, 0) Cells(i, 5) = buf i = i+1 while 'ポートクローズ:CloseHandle (ポートのハンドル) com = CloseHandle(h)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問