Burak Demirsoy Ответов: 1

Как правильно получать данные от Mbus в C#?


У меня действительно ужасная проблема, от которой меня почти тошнит. В течение 2-3 дней я занимался этим вопросом протокола, и я нахожусь здесь, чтобы получить некоторую помощь от вас, ребята. Я надеюсь, что буду решать. Заранее спасибо. У меня был код в Vb, который использует старую библиотеку MsComm. Поэтому я решил изменить все вещи с помощью C#. Я в порядке с открытием , закрытием порта и отправкой данных и т. д.

В Vb; у меня есть следующая часть кода, которая предназначена для получения данных от драйвера Mbus через RS485. Как только вы отправили это сообщение, оно ответит вам на получение данных. Это работает, и никаких проблем.

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 я вижу, что горит желтый светодиод. Обычно при получении данных вы можете видеть, что красный светодиод также горит. Код на языке Си# ;

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;


Все работает нормально. Я вижу, как я уже сказал, поток данных через Mbus через RS485. Я вижу это по светодиоду TX, который горит все время, когда я посылаю данные.Однако, как я уже сказал, RX led не срабатывает.

George Jonsson

Вы сравнивали содержимое переменной "отправка" между vb и c#?
Каково содержание "DriverNo"?
Не ВБ запустить показатель с 1?
В этом случае вы должны уменьшить индекс в c#
Преобразовать.ToByte((Strings.Mid(DriverNo, 0, 2))); // Начните с 0 вместо этого

Burak Demirsoy

Как вы можете видеть из строк.Середине какой микрофон.На языке VisualBasic.CompilerServices функции класса.Поэтому он не начинается с 0 в C#. DriverNo = "20021267" все они определены в коде.

Я сравнил отправленные данные с C# и Vb.Net, оба показывают один и тот же вывод в текстовом файле (я написал в тексте вывод). Итак, с этого момента я понял, что проблема должна быть связана с выходной функцией [sp.Output(VB.Net MSComm) sp.Write(C# Serial Com))

sakzu@hotmail.com

На моем канале каждый день Бурак бей, Бенде МБУС иль uğraşıyorum şuan ве не yaptıysam сведения alamadım. Tx ok ama rx te problem var bu konuda yardımcı olabilir misiniz?

1 Ответов

Рейтинг:
4

Rob Philpott

Здесь может быть что-то не так. Границы массива VB были хорошим местом.

Chars в .Сеть-это 16 бит, и это может быть проблемой. Вы работаете с двоичными данными, поэтому не используйте их. Просто проверяю документацию для класса SerialPort, кодировка по умолчанию-ASCII, 7 бит. Все, что выше 0x7f, преобразуется в знак вопроса. Поэтому я подозреваю, что ваши данные повреждены.

http://msdn.microsoft.com/en-us/library/y2sxhat8(v=против 110).aspx[^]

Вместо этого не подходите близко к струнам и символам.

Попробуй:

sp.Write(SendData, 0, 8);

И посмотрим, поможет ли это.


Burak Demirsoy

Вы совершенно правы. До того, как вы сказали мне, что я сделал это, и прямо сейчас я решил получать данные. Однако проблемы все еще существуют.


Я решил проблему, которая была перенесена на четность. По умолчанию это не так, но в моей системе это должно было быть даже. Так что я могу получать данные прямо сейчас, но проблема теперь в скорости передачи данных.

В Vb. Я использую функцию valveopen forthtimes, чтобы открыть клапан.Поэтому я кодирую так ;

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

Однако в C# это как бог знает сколько раз он будет работать :). Произвольно я могу открыть клапан прямо сейчас. Все вещи одинаковы, и никаких проблем. Я думаю, что скорость передачи данных MSComn и последовательного порта различны.

Burak Demirsoy

Таким образом, функция открытого клапана заключается в следующем ;

private void OpenValve(string DeviceNo,bool ValvePosition)
{

строка giden = "";
SendData[0] = 0xfa;
SendData[1] = Конверсии.ToByte(Strings.Mid(DeviceNo, 1, 2));
SendData[2] = Конверсии.ToByte(Strings.Mid(DeviceNo, 3, 2));
SendData[3] = Конверсии.ToByte(Strings.Mid(DeviceNo, 5, 2));
SendData[4] = Конверсии.ToByte(Strings.Mid(DeviceNo, 7, 2));
если (положение клапана)
SendData[5] = 50;
еще
{
SendData[5] = 51;
}
SendData[6] = CheckSum_Temass(5);
SendData[7] = 0xfb;



sp.Write(SendData, 0, SendData.Длина);

Мне удается открыть/закрыть клапан, но это требует времени. Я постоянно вызываю функцию OpenValve (). Это должно быть похоже на то, когда я вызываю функцию OpenValve (), она должна работать в первый раз. Но это не так, и я не могу понять почему ?

verniy

мерхаба Бурак.
internete o kadar çok şey aramama rağmen mbus haberleşme ile ilgili düzgün bilgi bulamadım.haberleşmede yardımcı olabilir misiniz?

Rob Philpott

Хорошо, это звучит как типичная проблема, когда вам нужно "очистить" данные, чтобы получить их для отправки. SerialPort не раскрывает этот метод, но, оглядываясь вокруг, другие предположили, что это может быть связано с рукопожатием. Как вещь, чтобы попробовать, установите DtrEnable и Rtsen в true на последовательном порту одновременно с установкой БОД/четности и т. д. Стоит попробовать..

Burak Demirsoy

Я попробовал, но ничего не изменилось. Но я нашел способ управлять этим. Поэтому я посмотрел на ns times для получения и отправки времени и, наблюдая, теперь я могу открыть закрыть клапан и получить данные. Однако это кажется глупым, потому что я промываю функцию open close несколько раз, а также для приема. Теория действительно не соответствует жизни :) Спасибо за помощь.