Skocz do zawartości

Wysyłanie danych przez pin TX w arduino UNO


marzel

Pomocna odpowiedź

Chcę wysyłać komunikaty z arduino do przemiennika częstotliwości, przemiennik komunikuje się za pomocą protokołu RS485. Zakupiłam speljalny konweret UART <-> RS485, więc kod mogę pisać w protokole serial. Po zgraniu programu  i odłoczeniu arduino od komputera nie wysyła ono żadnych danych (nie świeci się led TX). Czy ktoś może wie jak to naprawić? 

Wcześniej wspomniany kod załączam poniżej.

Dziękuje za wszelką pomoc 😀

#include<util/crc16.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(0, 1);
struct DataPacket
{
  uint8_t DestinationAddress;
  uint8_t function;
  uint8_t functioncode;
  uint8_t functioncode1;
  uint8_t data;
  uint8_t data1;
  uint16_t CRClow;
  uint16_t CRChigh;
} ;




             


void setup(){
  
              
  mySerial.begin(9600);
  
} 
void loop(){
  DataPacket TxPacket;
              TxPacket.DestinationAddress = 0x01;
              TxPacket.function = 0x06;
              TxPacket.functioncode = 0x01;
              TxPacket.functioncode1 = 0x0E;
              TxPacket.data = 0x00;
              TxPacket.data1 = 0x64;
               TxPacket.CRClow = lowByte(MakeCRC(&TxPacket));
               TxPacket.CRChigh = highByte(MakeCRC(&TxPacket));

  mySerial.write(TxPacket.DestinationAddress);
  mySerial.write(TxPacket.function);
  mySerial.write(TxPacket.functioncode);
  mySerial.write(TxPacket.functioncode1);
  mySerial.write(TxPacket.data);
  mySerial.write(TxPacket.data1);
  mySerial.write(TxPacket.CRClow);
  mySerial.write(TxPacket.CRChigh);
  
  
}
uint16_t MakeCRC(struct DataPacket *InPacket)
{
  uint16_t TempCRC = 0xFFFF;
  TempCRC = _crc16_update(TempCRC, InPacket->DestinationAddress);
  TempCRC = _crc16_update(TempCRC, InPacket->function);
  TempCRC = _crc16_update(TempCRC, InPacket->functioncode);
  TempCRC = _crc16_update(TempCRC, InPacket->functioncode1);
  TempCRC = _crc16_update(TempCRC, InPacket->data);
  TempCRC = _crc16_update(TempCRC, InPacket->data1);
    return TempCRC;
}

 

Link do komentarza
Share on other sites

Strukturę TxPacket uzupełnij w setup(); ponieważ i tak nic w niej się nie zmienia. CRClow i CRChigh są 16 bitowe jesteś pewien że zostaną one poprawnie wysłane? Być może lepiej byłoby stworzyć wskaźnik do całej struktury jako uint8_t 

Pseudokod:

#include<stdio.h>
#include<inttypes.h>
#include<stdlib.h>

struct DataPacket
{
  uint8_t DestinationAddress;
  uint8_t function;
  uint8_t functioncode;
  uint8_t functioncode1;
  uint8_t data;
  uint8_t data1;
  uint16_t CRClow;
  uint16_t CRChigh;
} ;

uint8_t * ptr;
int main() {
   
struct DataPacket TxPacket;   

              TxPacket.DestinationAddress = 0x01;
              TxPacket.function = 0x06;
              TxPacket.functioncode = 0x01;
              TxPacket.functioncode1 = 0x0E;
              TxPacket.data = 0x00;
              TxPacket.data1 = 0x64;
               TxPacket.CRClow = 10000; // tu fun CRC
               TxPacket.CRChigh = 3000; // tu fun CRC 
 ptr = (uint8_t*)&TxPacket;  
   
   
   for(int i = 0 ; i <sizeof(TxPacket); i++){
        printf("dane struct = %i\n", ptr[i] );
   }
 }

do przetestowania na https://www.jdoodle.com/c-online-compiler/ dla AVR zamień printf na serial.write

Edytowano przez _LM_
Link do komentarza
Share on other sites

To że wysyłasz bajt po bajcie ze swojej struktury ponieważ serial write oczekuje właśnie takich danych https://www.arduino.cc/reference/en/language/functions/communication/serial/write/ Tymczasem u ciebie dwie zmienne CRC są 16bitowe. No i w pętli zawsze to ładniej wygląda

Edytowano przez _LM_
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)
Dnia 21.08.2021 o 09:25, ethanak napisał:

Pytanie z ciekawości: po co używasz SoftwareSerial na pinach, na których przecież masz UART?

Bo myślałam, że to pomoże mi przesłać informacje właśnie przez te piny (a nie przez USB). Zmieniłam teraz 0, 1 na piny 3 i 4 (tak jak w kodzie poniżej), ale nadal arduino nic przez nie nie przesyła.

#include<util/crc16.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4);
uint8_t* ptr;

struct DataPacket
{
  uint8_t DestinationAddress;
  uint8_t function;
  uint8_t functioncode;
  uint8_t functioncode1;
  uint8_t data;
  uint8_t data1;
  uint8_t CRClow;
  uint8_t CRChigh;
} ;

void setup(){
  Serial.begin(9600);
  //ustawienie danych z przykładowej ramki 
  DataPacket TxPacket;
              TxPacket.DestinationAddress = 0x01;
              TxPacket.function = 0x06;
              TxPacket.functioncode = 0x01;
              TxPacket.functioncode1 = 0x0E;
              TxPacket.data = 0x00;
              TxPacket.data1 = 0x64;
              TxPacket.CRClow = lowByte(MakeCRC(&TxPacket));
              TxPacket.CRChigh = highByte(MakeCRC(&TxPacket));
  
   ptr = (uint8_t*)&TxPacket;  
   
   //wysłanie danych
   for(int i = 0 ; i <sizeof(TxPacket); i++){
        mySerial.write(ptr[i]);
   }
   
  //odczytanie danych wysyłanych przez przemiennik częstotliwości 
   if(mySerial.available()>0){
     messin = mySerial.read();
     Serial.println(messin);
   }
} 
void loop(){
  
  }
  
  //funkcja obliczająca numer CRC zgodnie z instrukcją
uint16_t MakeCRC(struct DataPacket *InPacket)
{
  uint16_t TempCRC = 0xFFFF;
  TempCRC = _crc16_update(TempCRC, InPacket->DestinationAddress);
  TempCRC = _crc16_update(TempCRC, InPacket->function);
  TempCRC = _crc16_update(TempCRC, InPacket->functioncode);
  TempCRC = _crc16_update(TempCRC, InPacket->functioncode1);
  TempCRC = _crc16_update(TempCRC, InPacket->data);
  TempCRC = _crc16_update(TempCRC, InPacket->data1);
    return TempCRC;
}

 

Edytowano przez marzel
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.