C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: シリアル通信について(高速)


(過去ログ 123 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■73305 / inTopicNo.1)  シリアル通信について(高速)
  
□投稿者/ くま (1回)-(2014/09/09(Tue) 21:32:40)

分類:[.NET 全般] 

環境
os:windows7-pro
vs2013

シリアルの受信のみを行い受信したデータをCSVファイルに書き込むソフトを作成しております
受信データは100BYTE程度のデータが1秒当たり6回送られてきます
受信データが欠落してしまい困っています
ラインモニタで確認するとデータはきています

ResultReadはスレッドから呼び出されます
スレッドは10msで動かしています

データを取りこぼさない方法をご指導お願いします

設定
SerialPort1.PortName = 1
SerialPort1.BaudRate = 19200
SerialPort1.DataBits = 8
SerialPort1.Parity = 0
SerialPort1.StopBits = 1
SerialPort1.Handshake = IO.Ports.Handshake.None
SerialPort1.WriteBufferSize = 8192
'SerialPort1.ReadBufferSize = 4096
SerialPort1.ReadBufferSize = 4096
SerialPort1.ReadTimeout = 3000
SerialPort1.WriteTimeout = 3000
SerialPort1.RtsEnable = False
SerialPort1.DtrEnable = False

Public Function ResultRead() As Boolean

Dim strReturnData As String = ""
Dim intRet As Integer = 0
Dim intCsvSaveFlag As Integer = 0

Try

'実績確認
Try

intRet = ReadCommand(strReturnData)

If intRet = 1 Then
          'ファイルに保存
MakeCsv(strReturnData)
ElseIf intRet = -1 Then

End If

Catch ex As Exception
Return -1
End Try

End Function

Public Function ReadCommand(ByRef strReturnData As String) As Integer

Try

strReceiveData = ""

AddHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived

ReceiveDone.Reset()

ReceivePoint:

'受信待ち
ReceiveDone.WaitOne(1000)
ReceiveDone.Reset()
'ReceiveDone.Dispose()

'受信なし
If strReceiveData.Length = 0 Then
Return 0
Else
'Debug.Print(strReceiveData)
End If

If strReceiveData.Length >= 2 Then
strReturnData = MidB(strReceiveData, 2, strReceiveData.Length - 1)
End If

Catch ex As Exception
Return -1
Finally
RemoveHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived
End Try

Return 1

End Function

Public Shared Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

Dim dev As SerialPort
Dim intRetry As Integer = 0

Try

dev = DirectCast(sender, SerialPort)

If e.EventType = SerialData.Chars Then

Try

'ETXまで受信
dev.Encoding = System.Text.Encoding.GetEncoding("SHIFT-JIS")
strReceiveData = dev.ReadTo(Chr(3))
'Debug.Print(strReceiveData)
If strReceiveData <> String.Empty Then
If ReceiveDone IsNot Nothing Then
ReceiveDone.Set()
End If
End If

Catch ex As Exception
strReceiveData = String.Empty
End Try

End If

Catch ex As Exception

End Try

End Sub
引用返信 編集キー/
■73306 / inTopicNo.2)  Re[1]: シリアル通信について(高速)
□投稿者/ 通りすがり (8回)-(2014/09/09(Tue) 22:22:12)
取りこぼすというより読んでないってのが正しそうだ。給料もらって
組んでるならこんなとこで質問してないで勉強したら??
引用返信 編集キー/
■73309 / inTopicNo.3)  Re[2]: シリアル通信について(高速)
□投稿者/ daive (30回)-(2014/09/09(Tue) 23:56:47)
ソースを張り付けるときは、
投稿モード:図表モード (ソースコードを貼る場合はこちらを使用)
⇒余裕が無くて、見れていませんか?

休憩がてら、 ^^) _旦~~
検索ワード:NonSoft RS232C
で、検索してみてください。
引用返信 編集キー/
■73310 / inTopicNo.4)  Re[1]: シリアル通信について(高速)
□投稿者/ オショウ (142回)-(2014/09/10(Wed) 12:29:17)
2014/09/10(Wed) 12:31:18 編集(投稿者)

> ResultReadはスレッドから呼び出されます
> スレッドは10msで動かしています
>
> データを取りこぼさない方法をご指導お願いします

  う〜ん・・・どんなPC使っているの?
  シリアルポートは、PC本体?PCIカード?USB変換?

  通常、取りこぼしたら、バッファオーバーランなので、エラーを
  監視すれば解るはず。

  ReadTo で、ETXまで読み待ちしているので、それで取りこぼしが
  あるなら、読み取ったデータを保存する方でCPU負荷が高すぎ
  てシリアル受信が動かなかった場合くらい。

  Win7 Pro が動作しているPCだということですが、USB変換の
  場合だと、取りこぼしがあるようなメーカー・型式の場合がある
  ので、ドライバーの詳細設定を調整する必要がある。
  調整しても、どうにもならないメーカー・型式もあるので要注意
  ですが。

※ 因みに、全然、高速じゃ〜ないですヨ!
  複数チャンネルを非同期でバシバシ通信やっているので、たかだか
  1ch で、19200bps 取りこぼしなんて通常ありえない。
  プログラムの問題か、ハードウェアの問題・・・

以上。参考まで
引用返信 編集キー/
■73314 / inTopicNo.5)  Re[2]: シリアル通信について(高速)
□投稿者/ くま (3回)-(2014/09/10(Wed) 22:08:05)
Public Shared Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

Dim dev As SerialPort
Dim intRetry As Integer = 0

の立ち上がりで
RemoveHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived
することで解決しました


オショウ様
一応ハードはPC本体のシリアル二つとPCI増設のシリアル4つで合計6つの通信を非同期で行っています
あとはソケット通信が6個かな?
スレッドは画面表示等を合わせて20個ぐらい動いています
CPU使用率はタスクマネージャで見る限り20%も行ってないようにみえました

プログラムの問題でよかったです
ありがとうございました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -