シリアル通信時の受信データ欠損について
現在、PCとPLC間のシリアル通信にて、受信データの欠損が発生しております。
ソフト上のログにて受信データを確認しますと、必ず最初の16Byteは受信出来ていることが分かりました。
対策としてFIFOバッファ内のデータをメインメモリに移動する割り込み優先度を上げて検証してみました(レジストリのPriorityControlにて、DWORD32ビット値を新規追加し、対象のCOMポートの優先度を "2" に設定)。
参考サイト:
WindowsのRS-232Cシリアル通信で受信データに欠落が発生する
上記対応で大きく改善はしましたが、受信データの欠損はまだ発生が見られます。
そこで質問ですが、
- 上記設定にて、優先度を "3" に上げると何か問題等発生する可能性はあるのでしょうか?
- 他に対策等あれば教えていただけないでしょうか?
宜しくお願い致します。
下記、追記致します。宜しくお願い致します。
追記
- 使用言語 C#
- baurate 115200
- タイムアウト値 1秒
- PLC オムロン 型式は直ぐには分かりませんでした。
コマンド送信プログラム
//' バッファ クリア
try
{
Obj.DiscardOutBuffer(); //送信バッファのクリア
Obj.DiscardInBuffer(); // '受信バッファ クリア
}
catch (Exception exp)
{
return -1; //' [NG] 送受信バッファ クリア
}
myComStatusParams.Serial.PLC.ReceiveData = ""; //' 受信データ クリア
////FINSコマンド送信
rtn = SerialDataSend(ref Obj, strCommand);
if(rtn==false)
return -2;
myComStatusParams.Serial.PLC.TickCount = 0; //' タイムアウト監視カウンタ初期化
return 1;
# 受信プログラム
①private void SerialPortStage_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Serial.myComStatusParamsStage.Serial.PLC.ReceiveData += SerialPortPLC.ReadExisting();
}
② private void SerialPortStage_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
do
{
string StrLDReceiveData = "";
string Delimiter = "\r\n";
do
{
//1byteずつ受信(1文字ずつ)
StrLDReceiveData += ((char)(SerialPortPLC.ReadChar())).ToString();
} while (StrLDReceiveData[StrLDReceiveData.Length - 1] != Delimiter[Delimiter.Length - 1]);
} while (SerialPortPLC.BytesToRead != 0);
}
①、②の受信方法でデータ欠損の発生状況を確認しましたが、①②においても発生状況は変わりませんでした。
(ただし、②の方法では、割り込み優先度を上げる対策を行っての検証は実施していません。)
【追記】
GUIアプリケーションです。
送信は専用スレッドで動かしています。
上記、受信のイベントハンドラはメインスレッド上です。