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

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

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

Re[2]: VBシリアル送受信


(過去ログ 114 を表示中)

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

■67497 / inTopicNo.1)  VBシリアル送受信
  
□投稿者/ まつむら (1回)-(2013/08/06(Tue) 17:40:44)

分類:[VB.NET/VB2005 以降] 

OS   :WindowsXP SP2
使用言語:VB.net2008

シリアル送受信で、受信を試しています。

Public Function GetMsg(ByVal LoopNum As Integer, ByVal strNum As String) As String
Dim i As Integer ' ループカウンタ
GetMsg = "" '
For i = 0 To LoopNum '
GetMsg = GetMsg + frmMain.ComRead ' 受信処理  ※1
If strComp_Find(GetMsg, strNum) Then '
Exit Function ' ETXを見つけたら抜ける
End If '
Call WaitTime(100) '
Next '
End Function


Public Function ComRead() As String
Dim rDATA(512) As Byte
Dim rLen As Int32
Dim N As Integer
Dim A As String = ""
Dim i As Short = 0
ComRead = ""
Do
A = ""
bRet = CSP.ReadFile(hcomm, rDATA, 512, rLen, IntPtr.Zero)
For N = 0 To rLen
A = A & Chr(rDATA(N))
Next N
Loop While rLen > 512
strData = A
ComRead = A
End Function




※1の受信処理で、1回目の受信でETXが無かった場合に
もう1度受信処理をするのですが、この処理で取得したデータを見ると、
1回目と2回目の取得データの間に良く分からないスペース?のようなゴミが入ってしまいます。

もし、上記のような経験がある方で解決方法があれば御教授いただきたく。
よろしくお願いいたします。
引用返信 編集キー/
■67499 / inTopicNo.2)  Re[1]: VBシリアル送受信
□投稿者/ オショウ (81回)-(2013/08/06(Tue) 18:28:16)
> 使用言語:VB.net2008

  .NET にも関わらず、表記方法が、VB6 に見えるのは私の
  勘違い?

  .NET 2.0 以降では、SerialPortクラスがあります。
  ReadTo を知れば、幸せになれるかも・・・

以上。参考まで
引用返信 編集キー/
■67500 / inTopicNo.3)  Re[2]: VBシリアル送受信
□投稿者/ まつむら (2回)-(2013/08/06(Tue) 18:41:06)
お返事、ありがとうございます。

No67499 (オショウ さん) に返信
>>使用言語:VB.net2008
>
>   .NET にも関わらず、表記方法が、VB6 に見えるのは私の
>   勘違い?

元のソースはVB6のものです。
アップグレード?で2008に置き換えて使ってます。

記載してあるコードだと、スペース?のようなゴミが入る可能性があるのでしょうか?
もし、可能でしたらなぜ入るのかも知っておきたいのですが。

引用返信 編集キー/
■67502 / inTopicNo.4)  Re[1]: VBシリアル送受信
□投稿者/ 魔界の仮面弁士 (291回)-(2013/08/06(Tue) 19:01:42)
No67497 (まつむら さん) に返信
> シリアル送受信で、受信を試しています。

ここの掲示板の利用方法には
 『半角カナは使用しないでください。文字化けの原因になります。』
との記述があります。
次回以降はこのような文字を含めないよう、ご注意ください。


念のため、返信時のタイトル部も書き換えておきますね。
(元質問を編集するかどうかの判断はお任せします)


なお、VB2008 であれば、シリアル通信用に
System.IO.Ports.SerialPort クラスが用意されていますが、
今回はそれ以外の方法での通信を行っているようですね。

何という通信ライブラリをお使いですか?



> Dim i As Integer
> For i = 0 To LoopNum

これは、VB.NET 2002 時代(あるいは旧VB時代)の書き方です。

現行バージョンでは、ループ変数のスコープを狭くするために
 For i As Integer = 0 To LoopNum
のような記述を使うべきです。


> GetMsg = GetMsg + frmMain.ComRead
ループ内で、+ 演算子や & 演算子を繰り返し使うことは避けてください。
パフォーマンス上の問題があります(この点は VB6も同様です)。

文字列連結が必要なら StringBuilder を使いましょう。


> Public Function ComRead() As String
> Dim rDATA(512) As Byte
これは 0〜512 の「513バイト」を意味しますが、問題ありませんか?


> For N = 0 To rLen
> A = A & Chr(rDATA(N))
> Next N
Chr 関数/Asc 関数は、「文字」の変換に使う物なので、
rData(N) の内容によっては、データが破損してしまいます。
(この点は VB6 でも同様です。9x 系と NT 系で微妙に違いはありますが…)

バイナリデータのバッファリングが必要であれば、
MemoryStream + BinaryWriter を使う事をお奨めします。

あるいは、List(Of Byte) クラスとか。
引用返信 編集キー/
■67544 / inTopicNo.5)  Re[2]: VBシリアル送受信
□投稿者/ まつむら (4回)-(2013/08/08(Thu) 16:42:44)
皆様、いろいろとご指摘ありがとうございました。
シリアル部分をSerialPortをしクラスをを使用して改修することにしました。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -