# Programmas / Software >  Serial.write()

## sasasa

Dīvaini rezultāti man sanāk no masīva datiem.  _char packetBuffer[8];_
Ja izmantoju caur ciklu (for....), tad gļuko vērtības.
Ja izvadu ar vienu komandu kā _Serial.write(packetBuffer);_ tad arī gļuko. 
Ja ciklā uzrādu ka man vajag tikai masīva pēdējos 4 (5to9), tad pilnīgs sviests ####^%@$%
BET! Ja pirms tam ir izvadītas šīs masīva vērtības VISAS pēc kārtas pa vienai ar to garo penteri, tad pēc tam arī jebkura veida (cikla vai kopējā) rezultāti ir pareizie.
Vai kāds man var izskaidrot ko es tur daru nepareizi un no kātas ir?

----------


## Jurkins

Es vēl neesmu līdz seriālajam portam Arduino tēmā aizgājis tā pa nopietnam. Bet vienreiz izmantoju gan, un bija kaut kāda problēma. Gan neatceros, kas tur īsti bija, bet bija saistīts ar šo:
*Serial.write()*                                                                  Функция передает данные как бинарный код через последовательное  соединение.  Данные послаются как один или серия байтов. Для того, чтобы  передать данные как символы следует использовать другую функцию print().

----------


## WildGun

Mazliet pielabošu - Serial.print().

----------


## sasasa

Biju ielicis zemāk arī Serial.print() ar šiem pašiem datiem - rezultāti manā gadījumā identiski ar Serial.write(). Ja pirms tam nebija ar garo pierakstu izvadīti visi masīva dati, tad rādījās gļuki ar vērtībām. 
Par cik es tāds svētdienas lietotājs, tad nav īsti skaidrības kā var manīties masīva dati pēc tam, kad tie vienreiz jau izvadīti uz ekrāna. Saprotams, ka nav problomu izvadīt garajā pierakstā, bet rodas tada nestabilitātes sajūta, kad šādi mainās rezultāts

----------


## JenertAndzins

pamēģini pēc packetBuffer ielikt tā garumu sanāk 10 
Serial.write(packetBuffer,10);

----------


## Powerons

Tādi brīnumi var būt tad, ja neievēro masīva robežas, ja aizbrauc par tālu nekā masīvs aprakstīts. Tad sanāk kad masīva mainīgie uzbrauc virsū atmiņas apgabalam, kur glabājās kāds cits mainīgais, kas nav masīvs.

 Biežākā kļūda mēdz vūt, ar masīva pirmo vērtību, tas sākās ar 0. vai 1. un ja to sajauc tad masīva pēdējā vērtība var aizbraukt auzās.

Uz datoru programmējot tā problēma ir atrisināta, un programmēšanas vide met ārā kļūdu, kad mainīgie saskrējušies programmas darba laikā, bet cik zinu, tad AVR ir daudz vienkāršāks un tas tādu kontroili neveic.

Tā ir viena no versijām, bet varbūt esi saputrokis ko citu.

----------


## JDat

V;el vajadzētu nodefinēt kas tad īsti ir ta X. int, byte, long...
Pamēģini nodefinēt šādi: "char x;"
Tālāk jāpārvērš int (kuru dod Serial.read()) par char (kurš ir X).
Vai arī jāpārvērs int X par char pirms rakstīt iekš "packetBuffer[]".

Tipiska kūda priekš BASIC lietātāja. Tas ir sarkasms un teikts par mani...  ::

----------


## JDat

Paskatoties tālāk manuālī, konvertēšana notiek ar, piemēram, "char(X);" palīdzību.

Tāpat, eksperimenta laikā, iesaku uzvadīt char kā decimālu skaitli un/vai hexdecimālu skaitli, lai pārliecinātos ka Tu "saņem to ko vajag". Ne visi simboli ir parādāmi terminālī.

----------


## sasasa

> V;el vajadzētu nodefinēt kas tad īsti ir ta X. int, byte, long...
> Pamēģini nodefinēt šādi: "char x;"
> Tālāk jāpārvērš int (kuru dod Serial.read()) par char (kurš ir X).
> Vai arī jāpārvērs int X par char pirms rakstīt iekš "packetBuffer[]".
> [I]
> Tipiska kūda priekš BASIC lietātāja. Tas ir sarkasms un teikts par mani...


 Tā jau arī man ir _char x;
Principā jau nav runa par to ikā pārverst, bet gan par to ka viens un tas pats masīvs dažādi nolasot parādās atšķirīgi. 
Nolasot ar šo rādās gļuki:
     for (int i=0; i<9; i++){
        Serial.write(packetBuffer);
     } 
.
_bet šādi viss normāli:
_   Serial.write(packetBuffer[0]);
   Serial.write(packetBuffer[1]);
   Serial.write(packetBuffer[2]);
   Serial.write(packetBuffer[3]);
   Serial.write(packetBuffer[4]);
   Serial.write(packetBuffer[5]);
   Serial.write(packetBuffer[6]);
   Serial.write(packetBuffer[7]);
   Serial.write(packetBuffer[8]);
   Serial.write(packetBuffer[9]);

un ja tagad vēlreiz atkartoti pēc šī gara pieraksta lasu ar For... ciklu, tad tagad jau visas vertības ir savās vietās .. Tipa Garais pieraksts kaut kādā neizprotamā veidā sakarto vētības masīvā un tās pēc tam rādās pareizi lasot jebkāda veidā. Nu teorētiski NEVAR taču masīva vērtības nolasīties atšķirīgi izmantojot For.. ciklu. Bet praktiski izrādās ka var 
$%^##%##45
 1postā bildes iluistrācijai_

----------


## JDat

Un ja nelieto Serial.read() vispār.
Piemēram:

const int buffersize=10;
char packetBuffer[buffersize];

void Setup(){
for (int i=0; i<buffersize; i++){
     packetbuffer[i]=i+0x30;   //ierakstam ASCII 0-9 nevis skaitļus 0-9, kas būs "ķeburi" terminālī
  }
Serial.begin(9600);
}

void Loop(){
for (int i=0; i<buffersize; i++){
   Serial.write(packetbuffer[i]);   
  } 

//Tavas testa rindas
}

Vēl paskaties uz Serial.write(buf, len); pierakstu.
Vai uzmanīgi izlasīji visu no Arduino Reference manual?
http://www.arduino.cc/en/Reference/HomePage

Man nav arduino pa rokai tāpēc, viss ir teorētiskā filozofija. Attiecīgi, nav teikts ka pareizi izprotu problēmu un piedāvāju pareizu risinājumu.

----------


## Jurkins

Paeksperimentēju bišķi intereses pēc.


```
void setup() {
  Serial.begin(9600);
}

void loop() {  
  char* bufer[] = {"Shii","velnishkjiigaa","rinda","izvadaas","ljoti","korekti",",","nav","pamata","raizeem",".","Var","iet","iedzert", "aukstu", "alu","!"};
  for(int i=0; i <(sizeof(bufer)/sizeof(char*)); i++){
   Serial.write(bufer[i]);
   Serial.write(' ');
   delay(1000);
  }
}
```

 Šitāds kods strādā burvīgi. LV kodējumu gan nemāku ielikt  :: .

----------


## sasasa

Jā, šie testiņi strādā, bet saņemot UDP paketi caur WiFi, es tikai aptuveni nojaušu kam tur ir jabūt (OSC - Open Sound Control), bet reāli tā nu viņa gļuko ja izvēlos nolasīt no bufera tikai atsevišķu daļu, kas satur skaitlisko vertību. 
Bija pie vainas arī mans pieraksts _Serial.write(packetBuffer); Ierakstot Serial.write(packetBuffer,xx); Viss notiek!._ Lai gan joprojām nesaprotu kāpēc neuzrādot izmēru viena daļa, kas satur mainīga nosaukumu, tiek izvadīta bez kādam problemām, bet beigas ar tā vērtību tiek sačakarētas..



> char* bufer......


 Kā jau teicu - esmu programmēšānā gandrīz vai nulle un līdz tādam lietām ka char* vēl neesmu ticis un nezinu ko tas īsti nozīmē.

----------


## JDat

Gluzi kā liela daļa no citiem forumiešiem (lasīt: JDat izsakās par JDat). Tātad, liriku pie malas. Nezināšanas dēl daudz kas liekas mistisks. Ja jau gribi sktīties kas notiek ar UDP un ESP8266, tad noderēs arī Wireshark snifferis, ar kura palīdzību uz sutosā PC redzēsi, kas ad īsti tiek nosūtīts un ar seriālā porta palīdzību redzēsi ko Tavs arduino ir saņe'mis. Pieļauju domu ka būs vēl daudz dažādu vingrojumu.

----------

