如何在C#中从Mbus正确接收数据?

时间:2014-07-11 12:22:13

标签: serial-port rs485

我有一个非常可怕的问题让我几乎生病了。 2-3天,我一直在处理这个协议问题,我发现自己在这里得到你们的帮助。我希望我能解决。提前致谢。我在Vb中使用了旧的MsComm库代码。所以我决定用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发送数据时,我可以看到黄色引发火灾。通常在接收数据时,您可以看到红色指示灯也会触发。 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不会发射。

2 个答案:

答案 0 :(得分:0)

我解决了与平价相关的问题。在默认情况下它是没有,但在我的系统中,它应该是均匀的。所以我现在可以接收数据,但问题是现在的数据速度。

在Vb。我正在使用valveopen功能四次打开阀门。因此我编码像;

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

然而在C#中,就像上帝知道它将运行多少次:)。任意我现在可以打开阀门了。所有的东西都是一样的,没问题。我认为MSComn和串口的数据传输速度不同。

答案 1 :(得分:0)

我通过刷新读取和发送数据来解决问题。