Sarjadatan pullautus ulos PC:n Com-portista

Haudi,

käytössä on Arduino Uno joka lukee dataa sisään analogisen tulon kautta.

Tuolle datalle sitten tehdään temppuja ja lopputulemana saadut komennot pitäisi saada ulostettua
PC:n Com-portista RS232-sarjamuodossa. Tai oikeastaan riittäisi, että saisi komentoja
edes jollain tavalla RS232-muodossa ulos Arduinosta, ei tarvitse välttämättä olla tuota
PC:tä välissä…

Olisiko antaa tähän mitään hyviä vinkkejä? Onnistuisiko tämä tuolla Arduinon omalla
Software Serial libraryllä? Vai onko syytä käyttää jotain MAX232-tyyppistä rautaa tuon
toteuttamiseen?

Jos ymmärsin viestin oikein ja haluat Unosta tietoa ulos RS232 muodossa niin tarvitset seuraavia asioita:

TTL->RS232 muunnin (esim max232) tämä liitetään määritettyihin RX,TX-portteihin
Koodin joka tulostaa muokatun datan ulos.

Tässä on nopea SoftwareSerial esimerkki, joka on sama mitä arduinon kotisivuilla. Kommentit suomennettu ja pinnit muutettu levyn RX,TX merkintöihin sopivaksi. Tämä sallii minkä tahansa digitaalipinnien käytön sarjaliikenteeseen, mutta rajoitetulla nopeudella.

// SoftwareSerialin käyttöönotto
#include <SoftwareSerial.h>

//määritelläään lähetys ja vastaanotto pinnit sekä ledi pinni jolla voidaan todeta että data liikkuu
#define rxPin 0
#define txPin 1
#define ledPin 13

// uuden sarjaportin luominen ja atribuuttien antaminen

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // määritetään pinnien suunnat:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // Siirtonopeus dataa varten
  mySerial.begin(9600);
}

void loop() {
  // lKuuntele sisääntulevaa dataa ja tallenna se char-muotoon muuttujaan someChar
  char someChar = mySerial.read();
  // Tulosta sama char-muuttuja ulostuloon:
  mySerial.print(someChar);
  // muuta ledin tilaa jotta nähdään datan liikkuvan.  
  // ledin tila muuttuu joka toisella kirjaimella:
  toggle(13);

}


void toggle(int pinNum) {
  // vaihda ledin tila käyttäen pinState muuttujaa:
  digitalWrite(pinNum, pinState); 
  // jos pinState = 0, vaihde se 1,ja toisinpäin:
  pinState = !pinState;
}

Itselläni ei ko. korttia ole mutta uskon tämän koodin toimivan, Lauri Jämsä on käyttänyt sarjaportti 100G kiihtyvyysanturi-jutussaan ja siitä saa myös hyvän koodi esimerkin.

Todellisen sarjaportin käyttö Arduinossa löytyy täältä. Tämä on parempi koska se sallii kokonaisten string-muuttujien lähetyksen kerralla, jolloin ei itse tarvitse miettä string:n purkua char-muuttujiksi.

Jos tarvitset apua Max232 kytkennässä, niin pistä tähän ketjuun viestiä niin selvitetään MAX232:n käyttö.

Hyvää aisaa, mutta olisin joistain asioista eri mieltä. Ensimmäisen kerroitkin itse. Rajoitetulla nopeudella. Toinen on, että bit banging on tehtävä joko ohjelmassa ja estettävä keskeytykset tai ajastin keskeytyksellä ja estettävä muut keskeytykset. Samalla menee ajastimen käyttö muuhun puuhaan. Ja toisinaan bit banging ei ole ajoituksellisesti ollut millään lailla järkevä, kun taas UART on tehnyt tehtävänsä. Toisessa ohjelmassa sam koodi on toiminut moitteetta.

En tiedä paljonjo arduino piilottaa, mutta ihmettelen vain. En ole tutustunut syvällisemmin alustaan ja minun on vain helpompi kirjoittaa toimivia ohjelmia, kun voin ajatella aina mitä tapahtuu ja milloin. Keskeytykset ovat minulla kirjoitettuna config.h tiedostoon pinnien käytön kanssa Tämän jälkeen minulla on main() jossa on tilakone ja sitä seuraamalla voin piirtää paperillekin mitä tapahtuu ja missä.

Ja mitä stringeihin tulee niin eikö se ole jotenkin näin? Jos funktio haluaisi vain yhden charin, eikä stringiä, mutta silti osoittimena, char *, niin &(string[i]) tuolle funktiolle.

#define KOKO 15
char stringi[KOKO] = "kukkuluuruu";
//Jos halutaan  char kerrallaan lähettää:
unsigned char i=0;
while(i < KOKO ||stringi[i] != '\0'){
  kirjoitus_funktio(stringi[i]);
} 

Jos jätetäänkin hankala merkkien lähettely, ja siirrytään lähettämään raakaa dataa. Ja näiden luku terminaalista ei onnistu vaan tarvitaan jotain muuta.

Homma muuttuu, koska perässä ei olekaan NULLia.

#define KOKO 15
char buffer[KOKO];
unsigned char pituus = 0;
void lisaa_merkki(char merkki){
   buffer[pituus] = merkki;
   pituus++;
}
void laheta_data(){
  unsigned char i = 0;
  while(i < pituus){
     kirjoitus_funktio(buffer[i];
     i++;
  }
  pituus = 0;
}

Tuon kirjoitusfunktion tarvitsee sitten katsoa, että UART on vapaa kirjoitukseen, ettei rykäise sinne päälle mitään. Muistaakseni jotenkin näin: while(!(USART0SC & (1 <<URDE))){ ; }

Ja olkoon puheeni mitätön, mikäli arduino tarjoaa sopivat kirjastot.

Sitten yksi asia. Mikäli et pysty ilmaisemaan toivomuksiasi kahdeksalla bitillä, tarvitset protokollan. Yksinkertaisin on Lue N merkkiä, Tutki mitä se tarkoittaa. Jos et saa selvää aloita alusta. Jos meni liian pitkään aloita alusta. Ja lähettävä pää toimii: Lähetä N merkkiä, odota aikakatkaisu, lähetä seuraavat N merkkiä.

Kuitenkin joudut opettelemaan sarjaportin ohjelmoinnin tietokoneen puolella, mikäli meinaat tehdä jonkinlaisen käyttöliittymän laitteeseesi. Tuo QT artikkeli oli esimerkiksi hyvä siihen.