0

私は本当にひどい問題を抱えており、ほとんど病気になります。2 ~ 3 日間、私はこのプロトコルの問題に対処してきました。私が解決することを願っています。前もって感謝します。古い MsComm ライブラリを使用する Vb のコードがありました。そこで、すべてを C# で変更することにしました。ポートの開閉、データの送信などは大丈夫です。

Vbで; RS485経由でMbusドライバーからデータを受信するためのコードの次の部分があります。これを送信すると、データを取得するように応答します。それは動作し、問題はありません。

Dim SendData(19) As Byte
Dim sending As String
SendData(0) = &HFA
SendData(1) = Mid(DriverNo, 1, 2)
SendData(2) = Mid(DriverNo, 3, 2)
SendData(3) = Mid(DriverNo, 5, 2)
SendData(4) = Mid(DriverNo, 7, 2)
SendData(5) = 210

SendData(6) = CheckSum_Temass(5)
SendData(7) = &HFB

sending = ""
For i = 0 To 7
    sending= sending + Chr(SendData(i))
Next

SP.Output = sending

したがって、上記のコードは Vb と Vb.Net で正常に動作します。ただし、次のようにC#に変換すると; mbus ドライバーから応答がありません。RS485 経由でデータを送信しているときに、黄色の LED が点灯していることがわかります。通常、データを受信して​​いる間は、赤色の LED も点灯することがわかります。C# のコード ;

string sending= "";
byte[] SendData = new byte[8];
SentData[0] = 0xfa;
SendData[1] = Convert.ToByte((Strings.Mid(DriverNo, 1, 2)));
SendData[2] =  Convert.ToByte((Strings.Mid(DriverNo, 3, 2)));
SendData[3] = Convert.ToByte((Strings.Mid(DriverNo, 5, 2)));
SendData[4] = Convert.ToByte((Strings.Mid(DriverNo, 7, 2)));
SendData[5] = 210
SendData[6] = CheckSum_Temass(5); 
SendData[7] = 0xfb;

for (int i = 0; i <= 7; i++)
{
    sending= sending+ ((char)SendData[i]);
}

sp.Write(sending);

これには問題はありませんが、Vb コードは機能しますが、C# は機能しません。

C# では、以下は私のポートを開く関数の一部です。

    sp.PortName = portName;
    sp.BaudRate = baudRate;
    sp.DataBits = databits;
    sp.Parity = parity;
    sp.StopBits = StopBits.One;//stopBits;
    sp.PinChanged += SerialPinChangedEventHandler1;
    sp.ErrorReceived += SerialErrorReceivedEventHandler1;
    sp.DataReceived += new SerialDataReceivedEventHandler(DataReceived);

    sp.ReadTimeout = 1000;
    sp.WriteTimeout = 1000;

すべて正常に動作します。先ほど言ったように、RS485 経由で Mbus を通るデータの流れを見ることができます。データを送信するたびに発火するTX LEDから見ることができます。しかし、もう一度言いますが、RX LEDは発火しません。

4

2 に答える 2

0

読み取りデータと送信データをフラッシュすることで問題を解決しました。

于 2014-07-13T16:42:38.683 に答える
0

パリティに関連する問題を解決しました。デフォルトではなしですが、私のシステムでは偶数になるはずでした。だから今すぐデータを受信できますが、問題はデータの速度です。

Vbで。私はバルブを開くために4回バルブオープン関数を使用しています。したがって、次のようにコーディングします。

valveopen();
valveopen();
valveopen();
valveopen();

ただし、C#では、それが何回動作するかを神が知っているようです:)。勝手にバルブを開けられるようになりました。中身は同じで問題ありません。MSComnとSerial Portのデータ転送速度が違うと思います。

于 2014-07-12T10:14:29.620 に答える