Arduino Polska Forum

Pełna wersja: Problem z odczytem modbus rtu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam problem jak w temacie a mianowicie:
 Odczytuje i wysłane dane w HEX/BYTE lecz po przepisaniu do zmiennej typu byte przepisuje mi w kodzie asci.
a ja musze uzyskać postać np
Kod:
01 10 7d 00 00 16 59 ab

Tu prosty kod
Kod:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

bool flaga[2];
byte Adres=0x01;
byte buffor[8];
void setup() {
 
  Serial.begin(9600);
  Serial2.begin(9600);
  while (!Serial) {
    ;
  }


  Serial.println("Goodnight moon!");
// Serial2.write(byte(mySerial.read()));

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() {
  if (mySerial.available()) {
    Serial2.write(byte(mySerial.read()));
  for(int i=0;i<8;i++){
   
 
  buffor[i]+=mySerial.read();
 

                      }
 
                     
                            }
  if (Serial2.available()) {
    mySerial.write(byte(Serial2.read()));
  }

  for(int i=0;i<8;i++){
  Serial2.println(byte(buffor[i]));
 
 
                      }
if(buffor[0]==Adres ){

  Serial2.println("ok");
}

}
a to wpisuje do rejestru
Kod:
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31 33 32 0d 0a  238..0..0..132..
32 32 0d 0a 32 0d 0a 32 35 30 0d 0a 39 36 0d 0a  22..2..250..96..
32 33 38 0d 0a 30 0d 0a 30 0d 0a 31              238..0..0..1
A projekt jest prosty mam napisany w C# program na tablet 10" win 10 sa tam przyciski mierniki temperatury ładowani kontrola ogrzewania do przyczepy kampingowej arduino ma służyć jako expander I/O dlatego potrzeba aby Andino rozpoznawało swój unikalny adres oraz odpowiadało w standardzie RTU. Pomoże ktoś bardzie zawansowany.
Powinieneś się tu pochwalić źródłem tego programu C#, bo z Twojej wypowiedzi zrozumiałem, że on nadaje ciąg znaków "01 10 7d 00 00 16 59 ab" jako tekst, to pewnie że nie można tego zrobić jako proste rzutowanie, bo zamiast bajtu 01 do arduino przylatują dwa bajty dla znaków char '0' i '1' czyli w sumie to już liczba 16 bitowa, a spacja jest kolejną liczbą byte.
buffor[i]+=mySerial.read(); Tu nie wiem po co jest +, przecież jak przylatuje nowy znak to go tu wpisujesz = a nie dodajesz do poprzedniego który siedzi w buffor[i]?
Jak jednak nadaje z C# komendą analogicznie write z tablicy wartości bajtów to też rzutowanie nie jest potrzebne na byte.
Jak to ma być głupi przekaźnik to tylko powinno być odbierz/wyślij, żadnego for dla 8 bajtów. Bo ucieknie Ci jakiś bajt i już żadna ramka RTU nie będzie się kleić. Albo można weryfikować w programie, że zbierasz taką wybraną ramkę, sprawdzasz czy jest kompletna, czy CRC się zgadza i nadajesz ją dalej. Musisz wykrywać gdzie jest początek, gdzie jest koniec, zweryfikować, nadać. Chyba prościej wywalić wszystko i zostawić tylko 2 linijki, jak coś przyleciało z 1 to write na 2 i to samo z 2 do 1.