Kommunikation mellan PC - Arduino UNO

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Kommunikation mellan PC - Arduino UNO

Inlägg av Albireo »

Försöker upprätta en pålitlig kommunikation mellan en PC och Arduino UNO.

I PC:n finns ett program (skrivet i Autohotkey)
Programmet har två fönster - Ett fönster där text kan skrivas in och i det andra fönstret visas resultatet från Arduinon.
Kommunikationen till/från Arduino UNO sker i nuläget via USB.

Programmet i Arduino UNO skall i nuläget endast returnera de tecken som PC:n sänder.
Detta ser ut på följande sätt .:

Kod: Markera allt

void setup() {
  Serial.begin(115200);
}

void loop(){
  while (Serial.available() > 0) {
    Serial.write(Serial.read());
    }
}
Om kommunikationen mellan PC och Arduino är satt till 9600bps verkar kommunikationen fungera utan problem.
Om överföringshastigheten sätts till 19200 eller högre (115200) uppstår ett "mystiskt" problem.

1) Programmet på Arduinon startas.
2) AHK-programmet på PC:n startas.
Det första som händer är att en rubrik - - - - - - TERMINAL OUTPUT - - - - - - skickas till Arduinon

Om 19200bps används, returneras följande .: ý- - - - - - TERMINAL OUTPUT - - - - - -
Om 115200bps används, returneras följande .: ðð- - - - - - TERMINAL OUTPUT - - - - - -
Sedan fungerar kommunikationen som förväntat, men var kommer "slasktecknen" från?
Hur kan dessa "filtreras bort"? (har försökt analysera med Arduinos "Serie monitor".
Men upplever att dessa tecken inte visas där - (den analysen är dock inte fullkomlig)

Hur ska kommunikationen mellan PC / Arduinon se ut?
Vilken typ av struktur skall tecken som skickas från mitt program på PC:n ha?
(Hextal som 0x45 eller 45,46,47 eller 454647 eller ABCD eller ANSI eller....)
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Shimonu »

Alla hastigheter kommer inte fungera. Beror på hur väl de kan divideras från arduinons klocka.

.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av 4kTRB »

Kodade ett litet demo med 3 knappar i Java för att via usb tända och släcka en lysdiod på Uno.
https://elektronikforumet.com/forum/vie ... on+arduino
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Albireo »

Hmmm. ett betydligt besvärligare problem än det jag förberett mig på.

Ser inte varför problem skulle kunna uppstå med att kommunicera med en Arduino i "vilken hastighet som helst".
baud rate question, practical limits
Enligt denna länk finns en teoretisk gräns på ca 7Mb/s (vilket är betydligt mer än 115200bps)
Dessa baudrate .: 300, 600, 1200, 1800, 2400, 3600, 7200, 9600, 19200, 38400, 57600 or 115200 bps.
(vet inte varför dessa värden är standard för seriekommunikation)
USB 2.0 kan hantera upp till 480 Mbits/s. En liten tkn-buffert kan skapa begränsningar.
Önskas högre hastighet, kan en ethernetförbindelse nyttjas (ex. 100Mb/s).
En Uno kan förmodligen hantera 1.000.000 baud
______________________

När kommunikationen är upprättad uppstår inga problem att skicka tecken från PC:n till Arduinon samt åter.
Men varje gång PC-programmet startas kommer "skräptecken" (ett eller två st.).
Sedan fungerar kommunikationen helt utan problem.

Är det tecken som av någon anledning hannar i tecken-bufferten på Arduinon?
Har försökt tömma tkn-bufferten innan läsning skrivning. (men kan ha gjort fel)
Hade jag kunnat "filtrera bort" dessa skräptecken innan skarpt läge, hade problemet varit löst.

Ska försöka analysera exemplet jag fick - löstes kommunikationen med "handskakning"?
Ska filtret programmeras i Arduinon?
Men steg 1 - vilken typ av data ska skickas från PC:n till Aduinon? (ASCII / HEX eller....)
Vilken typ av data hanteras enklast av Arduinin?
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av 4kTRB »

Testa lite olika terminalprogram. Bray Terminal...
https://sites.google.com/site/terminalbpp/
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Albireo »

Testat det länkade terminalprogrammet (Tack!)

Direkt kommunikationen aktiveras, visas / returneras samma "skräptecken" som med mitt testprogram.
(har dock bara kollat en överföringshastighet - 115200)

Sedan fungerar kommunikationen utan problem...
(dvs. samma tecken som sänds - returneras...)

Sammanfattning!
Fortfarande oklart var "skräptecknen" kommer från - men ju mer jag testar verkar det alltid vara samma HEX-kod som skickas från Arduinon. Tecken som hamnar i någon buffert vid initiering - av någon anledning?
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av svanted »

kommer skräptecknen varje gång arduinon startas om eller när pc programmet startas om?
hur initieras inputbufferten i autohotkey?
kan det vara en felaktig eller obefintlig initiering?
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av 4kTRB »

Testa att addera en loop som väntar på Serial efter Serial.begin.
While(!Serial)
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Albireo »

svanted skrev:kommer skräptecknen varje gång arduinon startas om eller när pc programmet startas om?
Uppstår alltid när terminalprogrammet omstartas (med högre överföringshastighet än 9600bps)
(både "mitt" och andra...)
svanted skrev:… hur initieras inputbufferten i autohotkey?
Kan det vara en felaktig eller obefintlig initiering?
Svårare att svara på.
Initieringen jag använder hittade jag på Autohotkeys forum. (och är skrivet för Windows XP.)
Bättre hade varit att hitta hur den seriella initieringen borde se ut mot Arduino.
Sedan anpassa detta mot Windows 7 / 10 (Men inget jag hittat.)

1) Förutsättningar sätts upp .: COM3:baud=115200 parity=N data=8 stop=1 dtr=Off
2) Kommunikationen initieras på följande sätt (Autohtokey) - Endast initieringsfunktionen. (önskas hela programmet - inga problem!)

Kod: Markera allt

RS232_Initialize(RS232_Settings)
{	; ###### Extract/Format the RS232 COM Port Number ######
	; 7/23/08 Thanks krisky68 for finding/solving the bug in which RS232 COM Ports greater than 9 didn't work.
	StringSplit, RS232_Temp, RS232_Settings, `:
	RS232_Temp1_Len := StrLen(RS232_Temp1)  ; For COM Ports > 9 \\.\ needs to prepended to the COM Port name.
	If (RS232_Temp1_Len > 4)                   ; So the valid names are
		RS232_COM = \\.\%RS232_Temp1%             ; ... COM8  COM9   \\.\COM10  \\.\COM11  \\.\COM12 and so on...
	else                                          
		RS232_COM = \\.\%RS232_Temp1%
	
	; 8/10/09 A BIG Thanks to trenton_xavier for figuring out how to make COM Ports greater than 9 work for USB-Serial Dongles.
	StringTrimLeft, RS232_Settings, RS232_Settings, RS232_Temp1_Len+1	; Remove the COM number (+1 for the semicolon) for BuildCommDCB.
	; MsgBox ,, Row %A_LineNumber% -> %A_ScriptName%, RS232_COM=%RS232_COM% `nRS232_Settings=%RS232_Settings%
	
	;###### Build RS232 COM DCB ######
	; Creates the structure that contains the RS232 COM Port number, baud rate,...
	VarSetCapacity(DCB, 28)
	BCD_Result := DllCall("BuildCommDCB"
		,"str" , RS232_Settings ;lpDef
		,"UInt", &DCB)        ;lpDCB
	If (BCD_Result <> 1)
	{	; MsgBox, There is a problem with Serial Port communication. `nFailed Dll BuildCommDCB, BCD_Result=%BCD_Result%.
		; Exit
		RS232_FileHandle:=0
		Return %RS232_FileHandle%
	}

	; ###### Create RS232 COM File ######
	; Creates the RS232 COM Port File Handle
	RS232_FileHandle := DllCall("CreateFile"
		,"Str" , RS232_COM	; File Name         
		,"UInt", 0xC0000000	; Desired Access
		,"UInt", 3				; Safe Mode
		,"UInt", 0				; Security Attributes
		,"UInt", 3				; Creation Disposition
		,"UInt", 0				; Flags And Attributes
		,"UInt", 0				; Template File
		,"Cdecl Int")
	
	If (RS232_FileHandle < 1)
	{	; MsgBox, There is a problem with Serial Port communication. `nFailed Dll CreateFile, RS232_FileHandle=%RS232_FileHandle% `nThe Script Will Now Exit.
		RS232_FileHandle:=0
		Return %RS232_FileHandle%
	}

	; ###### Set COM State ######
	; Sets the RS232 COM Port number, baud rate,...
	SCS_Result := DllCall("SetCommState"
		,"UInt", RS232_FileHandle ;File Handle
		,"UInt", &DCB)          ;Pointer to DCB structure
	If (SCS_Result <> 1)
	{	; MsgBox, There is a problem with Serial Port communication. `nFailed Dll SetCommState, SCS_Result=%SCS_Result% `nThe Script Will Now Exit.
		RS232_Close(RS232_FileHandle)
		; Exit
	}

	; ###### Create the SetCommTimeouts Structure ######
	ReadIntervalTimeout        = 0xffffffff
	ReadTotalTimeoutMultiplier = 0x00000000
	ReadTotalTimeoutConstant   = 0x00000000
	WriteTotalTimeoutMultiplier= 0x00000000
	WriteTotalTimeoutConstant  = 0x00000000

	VarSetCapacity(Data, 20, 0) ; 5 * sizeof(DWORD)
	NumPut(ReadIntervalTimeout,         Data,  0, "UInt")
	NumPut(ReadTotalTimeoutMultiplier,  Data,  4, "UInt")
	NumPut(ReadTotalTimeoutConstant,    Data,  8, "UInt")
	NumPut(WriteTotalTimeoutMultiplier, Data, 12, "UInt")
	NumPut(WriteTotalTimeoutConstant,   Data, 16, "UInt")

	; ###### Set the RS232 COM Timeouts ######
	SCT_result := DllCall("SetCommTimeouts"
		,"UInt", RS232_FileHandle ;File Handle
		,"UInt", &Data)         ;Pointer to the data structure
	If (SCT_result <> 1)
	{	; MsgBox, There is a problem with Serial Port communication. `nFailed Dll SetCommState, SCT_result=%SCT_result% `nThe Script Will Now Exit.
		RS232_Close(RS232_FileHandle)
		; Exit
	} 
	; Msgbox %RS232_FileHandle%
	Return %RS232_FileHandle%
}
3a) Skicka en rubrik .: header := "- - - TERMINAL OUTPUT - - -" . chr(10) . chr(10) . ">>"
Det som skickas ser ut på följande sätt .: 0x2D,0x20,0x2D,0x20,0x2D,0x20,0x54,0x45,0x52,0x4D,0x49,0x4E,0x41,0x4C,0x20,0x4F,0x55,0x54,0x50,0x55,0x54,0x20,0x2D,0x20,0x2D,0x20,0x2D,0xA,0xA,0x3E,0x3E,
Slasktecken och rubrik visas direkt. Har testat olika fördröjningar, men utan resultat.
(Avslutar med tom post - ska det vara så?
Ska tecknen skickas på ovanstående sätt? (eller ska de sickas som sträng 2D202D20 osv...)
Jag har ingen aning.....


3b)
Skriver sedan in 1 2 3 4 - tecken för tecken returneras (som förväntat) - ex. på resultat (och slask tecken) .:
SimpleTerm1.jpg
4kTRB skrev:Testa att addera en loop som väntar på Serial efter Serial.begin.
While(!Serial)
Gav följande program på Arduino UNO .:

Kod: Markera allt

void setup() {
  Serial.begin(115200);
  while (!Serial) {}  // wait for serial port to connect. Needed for native USB port only - Ingen skillnad!
}

void loop(){
  while (Serial.available() > 0) {
    Serial.write(Serial.read());
    }
}
Upplevde dock ingen skillnad...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av sodjan »

Påverkas "slasktecknen" av *vad* du skickar? Om du t.ex. skickar ett enda mellanslag?

Sannolikt är det någon artefakt av uppkopplingen/initieringen av serieporten. Det är
nog bara något som du får "programmera bort", t.ex. genom att alltid skicka något vid
omstart av programmet som din Arduino känner igen och antingen inte svarar någonting
alls eller svarar med något fast överenskommet "OK". Eller att din Arduino måste få en
viss startsekvens innan den sätter svarsfunktionen som aktiv och börjar svara tillbaka.

Kanske inte lönt mödan att försöka förstå *varför* dessa tecken uppstår.
Nille86
Inlägg: 65
Blev medlem: 13 april 2019, 13:10:49

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Nille86 »

Vad är det som händer i 3a? Är det koden till autohotkeys?

Satt för övrigt själv och letade på hur uart fungerade på olika klockfrekvenser och hittad denna sida: https://cache.amobbs.com/bbs_upload7821 ... 08497.html

.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av sodjan »

> Det som skickas ser ut på följande sätt .:
> 0x2D,0x20,0x2D,0x20,0x2D,0x20,0x54,0x45,0x52,0x4D,0x49,0x4E,0x41,0x4C,0x20,0x4F,0x55,0x54,0x50,0x55,0x54,0x20,0x2D,0x20,0x2D,0x20,0x2D,0xA,0xA,0x3E,0x3E,

> Ska tecknen skickas på ovanstående sätt? (eller ska de skickas som sträng 2D202D20 osv...)

Vad är skillnaden?
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Albireo »

sodjan skrev:Påverkas "slasktecknen" av *vad* du skickar? Om du t.ex. skickar ett enda mellanslag?
Det blir samma slasktecken (vid samma baudrate), men andra kombinationer eller slasktecken vid andra baudrate.
Om tom sträng skickas eller ett blanksteg så returneras endast slasktecknen. (blanksteget kan inte identifieras)

sodjan skrev:... Det är nog bara något som du får "programmera bort" ...
Var inne på samma tanke, men har inte lyckats. (Beror kanske mest på att jag är dålig på att programmera Arduino)
Har försökt med följande .: (men misslyckats)
a) Tömma seriebufferten vid uppstart av programmet i Arduinon. (kanske gjort på fel sätt?)
b) Filtrera bort alla oönskade tecken. (svårt - ändras beroende på t.ex. baudrate)
c) Lade in fördröjningar (osäkert vilket moment som ska fördröjas)
d) Filtrera bort slasktecken med Autohotkey (inte optimalt, för jag planerar ett annat datautbyte mellan PC / Arduino, än att returnera det som skickas.)
e) Gjorde även ett försök att se datat från PC:n på en LCD-display (16x2 I2C) - men misslyckades få "läsligt" resultat.

sodjan skrev:...Kanske inte lönt mödan att försöka förstå *varför* dessa tecken uppstår.
I framtiden tänkte jag kunna avläsa Arduinon "när jag vill". I bufferten - hade jag tänkt - skulle endast finnas relevant data.
Min önskan är då att kunna lita på den data som då avläses från Arduinon. (vilket förmodligen ställer till problem, om skräptecken kan finnas mitt i datat...)
Har funderat om datat ska passera en FTP-server eller om ethernet är lösningen (men just nu känns dessa lösningar betydligt svårare...)

Nille86 skrev:Vad är det som händer i 3a? Är det koden till autohotkeys?
Du har redan fått svar :)
Jag ser inte direkt någon skillnad, men kanske Arduinon gör?
Är kommunikation med HEX-tecken i någon form bästa formatet?

Nille86 skrev:... hur uart fungerade på olika klockfrekvenser och hittad denna sida: https://cache.amobbs.com/bbs_upload7821 ... 08497.html
Intressant - hittade denna sida .: AVR Baud Rate Calculator där både baudrate (115200bps) och frekvens (Arduinon har väl 8MHz?) sättas in för ett resultat. Men dessa värden gäller väl i huvudsak enchipsdatorer som Atmel AVR

Problemet med slasktecken kvarstår :?
Tror fortfarande att det kan vara något med initieringen av kommunikationen mellan PC:n / Arduinon..
Hur initieras en seriell kommunikation med en Arduino Uno?
Finns något annat programspråk på PC:n som initierar en kommunikation med Arduinon och Windows 10?
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Rick81 »

Kan det vara så att slasktecken kommer när processorn initieras? Det är inget ovanligt.

Om du lägger till parity odd eller even borde du bli av med dem i så fall.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Kommunikation mellan PC - Arduino UNO

Inlägg av Albireo »

Tack för tipset!
Ställde först in paritet "udda" i Windows och "SERIAL_8O1" på Arduinon samt testade med "O" i Autohotkey...
Ingen skillnad. Slasktecknen returnerades "som vanligt". :?

Men så bytte jag till "jämn" paritet i Windows samt "Serial_8E1" på Arduinon och "E" i Autohotkey...
Och tro det eller ej, men inga slasktecken retrurneras... (ska testa lite till - tror nästan inte att det är sant...)

Tack så länge :bravo: :bravo:
Skriv svar