Windows 8 の C# VS2010 では、ターゲット マシンが win 7 または XP であるにもかかわらず、状況によっては DataReceived イベントが発生しないという非常に奇妙な問題があります。
シリアルポートを使用して報告する非常に古いが現在も監視デバイスと通信する非常に古い DOS を置き換えるアプリケーションを作成しています。機器にすぐにアクセスできないので、別の PC で実行するためのシミュレーターを作成しました。実際の機器を使用しようとするまで、すべてが機能します。
したがって、シリアル設定は
1200 ボー 7 ビット奇数パリティ 1 ストップ ビット ハンドシェイクなし
コードは基本的に次のとおりです
namespace ProjectNamspace
{
class SerialCom
{
static SerialPort ComPort;
public SerialCom(SerialCallback callBack, string portName)
{
_comPort = new SerialPort();
_comPort.PortName = portName;
_comPort.BaudRate = 1200;
_comPort.Parity = Parity.Odd;
_comPort.StopBits = StopBits.One;
_comPort.DataBits = 7;
_comPort.Handshake = Handshake.None;
// _comPort.ReadBufferSize = 1;
_comPort.ReadTimeout = 500;
_comPort.WriteTimeout = 500;
_comPort.NewLine = "\r";
_comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
CallBack = new SerialCallback(callBack);
}
private void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
byte data;
while (_comPort.BytesToRead > 0)
{
data = (byte)_comPort.ReadByte();
CallBack(data);
}
}
}
}
データが別の PC からのものである場合、私のアプリケーションは完全に機能します。
データがハードウェアから取得され、teraterm で表示される場合、完全に機能します。
データがハードウェアからアプリケーションに送信された場合、何も起こりません。
イベント ハンドラーにブレークポイントを設定すると、それが呼び出されることはありませんが、データが別の PC から取得された場合に機能します。
その後、もう一度試してみましたが、今回は PC の動作が遅く、他のすべての文字が疑問符 0x3F であったことを除いて、何らかの理由で動作しました。
これで、データ プロトコルは非常に単純になりました。単一の肯定応答文字が受信されるまで、7 文字のパケットが連続して繰り返されます。パケットは毎秒 1 パケットの割合で繰り返されるため、トラフィックが失われることはなく、ハンドシェイクは必要ありません。
パケットの形式は、12348A<DC4>
Where <DC4>
is ascii code 0x14 です。
シリアル データ ラインにオシロスコープを接続しましたが、期待通りの結果が得られました。
この時点での私の唯一の結論は、.NET シリアル ドライバが 1200 ボーまたは 7 ビットを好まないということです。<DC4>
または多分それはキャラクターが好きではありません。これらの古い歴史のポート設定での.NETシリアルドライバーの問題を知っている人はいますか?
古い MsComm アクティブ x コントロールを使用してポイントを証明したいのですが、.NET 以外のドキュメントが見つからないため、誰かが私を正しい方向に向けるか、上記に答えていただければ幸いです。