シリアル通信で連続で読みたくない時の処理について
- 題名: シリアル通信で連続で読みたくない時の処理について
- 著者: hiro
- 日時: 2013/08/07 17:32:45
- ID: 31738
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: シリアル通信で連続で読みたくない時の処理について
- 著者: オショウ
- 日時: 2013/08/08 2:39:42
- ID: 31741
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: シリアル通信で連続で読みたくない時の処理について
- 著者: hiro
- 日時: 2013/08/08 12:56:24
- ID: 31743
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: シリアル通信で連続で読みたくない時の処理について
- 著者: オショウ
- 日時: 2013/08/08 13:49:01
- ID: 31744
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: シリアル通信で連続で読みたくない時の処理について
- 著者: hiro
- 日時: 2013/08/08 16:24:01
- ID: 31745
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
お世話になります。
シリアル通信でデータを読むさい、DataReceivedを使用しないで読み込むことを考えています。
理由は、後述。そこでタイマー呼び出しで下記を実行しClearCommErrorでバイト数を数えて読み込みをしたいのですが、機器から送って何バイトからデータがあるのに0を返します。
下記のどこが悪いのか指摘していただけと助かります。よろしくお願いします。
xxxxx.cs
Microsoft.Win32.SafeHandles.SafeFileHandle hFile = MySerialClass.CreateFile(/*@"\\.\" +*/ SerialCounter1.sPortName, dwAccess, 0, IntPtr.Zero, 3, dwFlagsAndAttributes, IntPtr.Zero);
MySerialClass.Comstat comStat = new MySerialClass.Comstat();
int commErrors = 0;
MySerialClass.ClearCommError(hFile, ref commErrors, ref comStat);
if (comStat.cbInQue > 0)
{
Counter1_DataReceived();
return;
}
MySerialClass.cs
public partial class MySerialClass : Component
{
:
:
#region Nested type: COMSTAT
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct Comstat
{
public readonly uint Flags;
public readonly uint cbInQue;
public readonly uint cbOutQue;
}
#endregion
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
public static extern bool ClearCommError(Microsoft.Win32.SafeHandles.SafeFileHandle hFile, ref int lpErrors, ref Comstat lpStat);
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
public static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode,
IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
標準のDataReceivedを使いたくない理由:
検査機器(病院などで検査するもの)から出力されるデータを1件単位で正しいかどうか判断してそのデータをを保存処理したりするので、後述のデータが溜まります。
その際、このハンドラは、データが来ると次々何のためらいもなくデータを処理します。
現在の流れでは、来たデータがそのまま更新されるので、処理者が知らないうちに上書きしてしまいます。
そこで、苦肉の策としてタイマー処理で・・・となったわけです。
何かいい方法があれば、教えていただけると助かります。