Soros port (rs232)
Soros port (rs232)
Nem akkarom tovább OFF-olni az I2C -s témát, így inkább itt folytnám a csevejt.
Szóval, a problémám a következő: megy az adatátvitel rs232-n de valamit nem értek. Nem tudok átküldeni nullát. (ha én vagyok a hülye , nem ér nagyon kiröhögni, csak kicsit)
Az van, hogy ha változót küldök át akkor nem az értéket küldi át, hanem a számjegyek karakterkódját. Márpedig én csak változók tartalmát akarom átküldeni. Ami ugye lehet nulla is.
De ha átkonvertálom a változót karakterré akkor ha a változó nulla akkor ugyibár nem lesz semmilyen karakter, mert olyan nincs aminek a karakterkódja nulla.
A küldést a Print utasítással csinálom. Nem azzal kéne ugye? Ráadásként az még a végéhez hozzácsap egy "soremelés+kocsivissza" jelet.
Ötelt , tipp , javaslat?
Szóval, a problémám a következő: megy az adatátvitel rs232-n de valamit nem értek. Nem tudok átküldeni nullát. (ha én vagyok a hülye , nem ér nagyon kiröhögni, csak kicsit)
Az van, hogy ha változót küldök át akkor nem az értéket küldi át, hanem a számjegyek karakterkódját. Márpedig én csak változók tartalmát akarom átküldeni. Ami ugye lehet nulla is.
De ha átkonvertálom a változót karakterré akkor ha a változó nulla akkor ugyibár nem lesz semmilyen karakter, mert olyan nincs aminek a karakterkódja nulla.
A küldést a Print utasítással csinálom. Nem azzal kéne ugye? Ráadásként az még a végéhez hozzácsap egy "soremelés+kocsivissza" jelet.
Ötelt , tipp , javaslat?
Aham.
Ha jól tudom az Inkey utasítás megáll és vár.
Nekem azt kellene megoldanom, hogy egy adott hosszúságú adatfolyamot kell beolvasnom (ami mindig ugyan olyan hosszú), és eközben a program futása nem állhat meg egy pillanatra se.
Most a: "Config Serialin = Buffered , Size = 19" megoldást használom.
És a prog. csak akkor használja fel az értékeket, ha szükség van rá.
A következőképp:
If _rs_head_ptr0 <> 1 Then
If _rs232inbuf0(1) = 254 Then 'szinkron byte
If _rs232inbuf0(2) = 245 Then 'szinkron byte
If _rs232inbuf0(3) = 245 Then 'szinkron byte
If _rs232inbuf0(4) = 254 Then 'szinkron byte
For I = 1 To 13
J = I + 4 '4 szinkron byte van
Sorosadat(i) = _rs232inbuf0(j) 'hasznos adatok
Next
End If
End If
End If
End If
_rs_head_ptr0 = 0
End If
Ezzel a megoldással is lehet nullát fogadni?
Vagy másképp csináljam?
Más:
Ha egy poci adatot küld, és közben bejövö adat is érkezik, akkor nem lép fel adatvesztés a fogadott adatcsomagban?
Vagy inkább csináljam "kérdezz-felelek" módon?
Ha jól tudom az Inkey utasítás megáll és vár.
Nekem azt kellene megoldanom, hogy egy adott hosszúságú adatfolyamot kell beolvasnom (ami mindig ugyan olyan hosszú), és eközben a program futása nem állhat meg egy pillanatra se.
Most a: "Config Serialin = Buffered , Size = 19" megoldást használom.
És a prog. csak akkor használja fel az értékeket, ha szükség van rá.
A következőképp:
If _rs_head_ptr0 <> 1 Then
If _rs232inbuf0(1) = 254 Then 'szinkron byte
If _rs232inbuf0(2) = 245 Then 'szinkron byte
If _rs232inbuf0(3) = 245 Then 'szinkron byte
If _rs232inbuf0(4) = 254 Then 'szinkron byte
For I = 1 To 13
J = I + 4 '4 szinkron byte van
Sorosadat(i) = _rs232inbuf0(j) 'hasznos adatok
Next
End If
End If
End If
End If
_rs_head_ptr0 = 0
End If
Ezzel a megoldással is lehet nullát fogadni?
Vagy másképp csináljam?
Más:
Ha egy poci adatot küld, és közben bejövö adat is érkezik, akkor nem lép fel adatvesztés a fogadott adatcsomagban?
Vagy inkább csináljam "kérdezz-felelek" módon?
A program elso korben jonak tunik.
DE: a belso buffere az UARTnak kicsi. Ha megoldhato en a kerdezz-feleleket jatszanam el. Azzal biztosabb a kapcsolat.
Az UART 3 megszakitassal rendelkezik, ha nagyon kritikus azt is hasznald fel.
Az inbuf a 0-t is figyelembe veszi.
A 0-t azert nem dolgozza fel, mert a 0 az a karakterlanc vege karaktert jelenti. Azaz ha stringkent hasznalod az a ASC(0) karaktert nem tartalmazhat!
Printbin/inputbin páros nem használható esetleg?
Nezd meg a sugo ischarwaiting reszet:
"While the Inkey() will get the character from the HW UART when there is a character in the buffer, it will return a zero when the character is zero. This makes it unusable to work with binary data that might contain the value 0.
With IsCharWaiting() you can first check for the presence of a character and when the function returns 1, you can retrieve the character with Inkey or Waitkey."
Azaz:
1, levizsgalod van -e valami a bufferben.
ha van akkor inkey$-l beolvasod. Ennek veszed a bin ártákát, de ha inke$=0, akkor a bin értéke is 0!
Ha nincs semmi a bufferban akkor tovabblepsz....
Nos?
DE: a belso buffere az UARTnak kicsi. Ha megoldhato en a kerdezz-feleleket jatszanam el. Azzal biztosabb a kapcsolat.
Az UART 3 megszakitassal rendelkezik, ha nagyon kritikus azt is hasznald fel.
Az inbuf a 0-t is figyelembe veszi.
A 0-t azert nem dolgozza fel, mert a 0 az a karakterlanc vege karaktert jelenti. Azaz ha stringkent hasznalod az a ASC(0) karaktert nem tartalmazhat!
Printbin/inputbin páros nem használható esetleg?
Nezd meg a sugo ischarwaiting reszet:
"While the Inkey() will get the character from the HW UART when there is a character in the buffer, it will return a zero when the character is zero. This makes it unusable to work with binary data that might contain the value 0.
With IsCharWaiting() you can first check for the presence of a character and when the function returns 1, you can retrieve the character with Inkey or Waitkey."
Azaz:
1, levizsgalod van -e valami a bufferben.
ha van akkor inkey$-l beolvasod. Ennek veszed a bin ártákát, de ha inke$=0, akkor a bin értéke is 0!
Ha nincs semmi a bufferban akkor tovabblepsz....
Nos?
Igen , néztem a ISCHARWAITING() -et.
Hümm , hümm. Lehet hogy jó lenne.
Most kínomban mindenféle trükkel viszek át nullát. Működik, csak a hányinger kerülget tőle.
Vagy esetleg csináljam saját megszakban?
On Urxc Sorosbe 'Ha soros porton adat van, SOROSBE-re ugrik
Enable Urxc
Sorosbe:
Temp = Ischarwaiting()
If Temp = 1 then
Adat = Inkey()
End If
stb..stb...
Return
vagy, így:
Sorosbe:
Adat = Inkey()
Return
Arra gondolok, hogy ha bemegy a megszakba, akkor már tuti van a bufferben adat, semmi értelme megvizsgálni, hogy tényleg van e.
Nemtudom törlődik-e a megszak jelzés, ha én nem törlöm, fedolgozás után. Kell vajon törölnöm?
Az UART megszakjait épp most vizslatom a MEGA32 doksiában.
Most, nem tudom, kipróbálni, ezeket, mert melóhelyen vagyok. Majd este!
Hümm , hümm. Lehet hogy jó lenne.
Most kínomban mindenféle trükkel viszek át nullát. Működik, csak a hányinger kerülget tőle.
Vagy esetleg csináljam saját megszakban?
On Urxc Sorosbe 'Ha soros porton adat van, SOROSBE-re ugrik
Enable Urxc
Sorosbe:
Temp = Ischarwaiting()
If Temp = 1 then
Adat = Inkey()
End If
stb..stb...
Return
vagy, így:
Sorosbe:
Adat = Inkey()
Return
Arra gondolok, hogy ha bemegy a megszakba, akkor már tuti van a bufferben adat, semmi értelme megvizsgálni, hogy tényleg van e.
Nemtudom törlődik-e a megszak jelzés, ha én nem törlöm, fedolgozás után. Kell vajon törölnöm?
Az UART megszakjait épp most vizslatom a MEGA32 doksiában.
Most, nem tudom, kipróbálni, ezeket, mert melóhelyen vagyok. Majd este!
A hozzászólást 1 alkalommal szerkesztették, utoljára Atesz 2006. április 5. szerda, 7:56-kor.
Törlődik.
if ischarwaiting=1 then
adatjott=1
a$=inkey$
if len a$<>0 then
ertek=asc(a$)
else
ertek=0
endif
endif
if adatjott=1 then ->program mert a bejott adattal valamit tenni kell
endif
Nos, hogy tetszik?
De ahogy en hasznalom:
kikuldott adat HEXként megy ki. Így a számjegyek is karakterré alakulnak:))
if ischarwaiting=1 then
adatjott=1
a$=inkey$
if len a$<>0 then
ertek=asc(a$)
else
ertek=0
endif
endif
if adatjott=1 then ->program mert a bejott adattal valamit tenni kell
endif
Nos, hogy tetszik?
De ahogy en hasznalom:
kikuldott adat HEXként megy ki. Így a számjegyek is karakterré alakulnak:))
Nem rossz.
Megpróbáltam átírni a progit hogy a ischarwaiting -et használja, de azzal az a bajom, hogy figyelni kell, hogy hol kezdődik az adatcsomag eleje. és nem nagyon sikerült megcsinálnom. Igaz már alig láttam ki a fejemből.
Az este kísérleteztem. Úgynézki megvan a megoldás.
Egy irányba frankón működik, két irányba még van valami kis bug. (két proci között)
Az adó:
Dim Sa(17) As Byte
....
Printbin Sa(1) ; 17
....
A vevő:
Config Serialin = Buffered , Size = 17
Maradt ugyan az amit múltkor írtam.
Így átmennek a nullák is. És nem kell trükközni.
Az miért jó ha " a számjegyek is karakterré alakulnak" ?
Megpróbáltam átírni a progit hogy a ischarwaiting -et használja, de azzal az a bajom, hogy figyelni kell, hogy hol kezdődik az adatcsomag eleje. és nem nagyon sikerült megcsinálnom. Igaz már alig láttam ki a fejemből.
Az este kísérleteztem. Úgynézki megvan a megoldás.
Egy irányba frankón működik, két irányba még van valami kis bug. (két proci között)
Az adó:
Dim Sa(17) As Byte
....
Printbin Sa(1) ; 17
....
A vevő:
Config Serialin = Buffered , Size = 17
Maradt ugyan az amit múltkor írtam.
Így átmennek a nullák is. És nem kell trükközni.
Az miért jó ha " a számjegyek is karakterré alakulnak" ?
Üdv!
Segítsetek mert lassan már lemegyek hídba
Szimulátorban fut a következő program:
http://www.tanyalap.hu/Moslekos/dogman/ ... i_read.bas
$regfile = "Attiny2313.dat"
$baud = 19200
$crystal = 4000000
Dim B As Byte
Dim Na As String * 10
Waitms 100
Config Serialin = Buffered , Size = 10
Enable Interrupts
Print "AT"
'Print "ATD>ME1;" 'tárcsázd a telefonmemória első számát
Goto Ver1
end
Ver1:
'/////////////////////
' verzió 1
'/////////////////////
Do
While _rs_head_ptr0 <> _rs_tail_ptr0
Print "adatvan"
Wend
'Wait 1
Loop
Ver2:
'/////////////////////
' verzió 2
'/////////////////////
Do
If Ischarwaiting() = 1 Then
Print "na: " ; Na
End If
Wait 1
Loop
End
Küld com1-en egy mobilnak AT parancsot amire annak egy választ kellene visszaadnia.
Valami miatt azonban a válasz nem jön be.
Egy max232-vel van bekötve kifele és befele is minden oké, rengeteg progival, híperterminállal, mobil saját progijával kipróbáltam, még visual basicben is írtam egy komm progit, frankón mennek/jönnek a parancsok.
De a szimulátorból csak a telefon felé van kommunikáció...
Segítsetek mert lassan már lemegyek hídba
Szimulátorban fut a következő program:
http://www.tanyalap.hu/Moslekos/dogman/ ... i_read.bas
$regfile = "Attiny2313.dat"
$baud = 19200
$crystal = 4000000
Dim B As Byte
Dim Na As String * 10
Waitms 100
Config Serialin = Buffered , Size = 10
Enable Interrupts
Print "AT"
'Print "ATD>ME1;" 'tárcsázd a telefonmemória első számát
Goto Ver1
end
Ver1:
'/////////////////////
' verzió 1
'/////////////////////
Do
While _rs_head_ptr0 <> _rs_tail_ptr0
Print "adatvan"
Wend
'Wait 1
Loop
Ver2:
'/////////////////////
' verzió 2
'/////////////////////
Do
If Ischarwaiting() = 1 Then
Print "na: " ; Na
End If
Wait 1
Loop
End
Küld com1-en egy mobilnak AT parancsot amire annak egy választ kellene visszaadnia.
Valami miatt azonban a válasz nem jön be.
Egy max232-vel van bekötve kifele és befele is minden oké, rengeteg progival, híperterminállal, mobil saját progijával kipróbáltam, még visual basicben is írtam egy komm progit, frankón mennek/jönnek a parancsok.
De a szimulátorból csak a telefon felé van kommunikáció...
Hülye kérdés: Mobilnál 19200 a sebesség?
Átírom:
Tippek:
http://www.bipom.com/appnotes/bascom8051/an0031.shtm
http://www.bipom.com/notes8051.shtm
Átírom:
Kód: Egész kijelölése
'
$sim '<=Futtatáskor (élesbe fordítva) ez igaz nincs benne?
$regfile = "Attiny2313.dat"
$baud = 19200
$crystal = 4000000
Dim B As Byte
Dim Na As String * 10
Waitms 100
Config Serialin = Buffered , Size = 10
Enable Interrupts
Print "AT"
'Print "ATD>ME1;" 'tárcsázd a telefonmemória első számát
'<=Az AT-ra OK-l válaszol a telefon? Illetve jön-e vissza valami?
'(
Do
While _rs_head_ptr0 <> _rs_tail_ptr0
Print "adatvan"
Wend
'Wait 1
Loop
')
'ezt kivagjuk kell a francnak:)
Do
If Ischarwaiting() = 1 Then
Na= Waitkey() '<=Ez a sorod hianyzik, nem olvas be adatot!!!!!
Print "na: " ; Na;" ";asc(Na)
End If
Wait 1
Loop
End
http://www.bipom.com/appnotes/bascom8051/an0031.shtm
http://www.bipom.com/notes8051.shtm
A telefont bármilyen más AT-s kommunikációs programmal simán lehet írni-olvasni, szal a max ármaköröm csatakozók, kábel tuti jó.Robert írta:Hülye kérdés: Mobilnál 19200 a sebesség?
A sebesség 19200 gyárilag fix.
Most továbbléptem hibakeresésből:
elindítom az emulátort(F2) bepipálom az exit gomb mellett a Terminal pipát (így az igéret szerint a setupban beállított soros porton kommunikál) elindítom a progit amiben most ez a parancs van ki irányba:
Print "AT+CMGL=4"
Ez a parancs lekéri a telefon 4-es memójából az sms-eket, van benne vagy 40 szal itt már kéne jönni adatnak.
parancs kimegy a terminal emulator windowba, de befele látszólag semmi.
Ekkor elindítom a programszerkesztő ablakban fent a terminal emulatort, ott meg csak úgy szakad befele a sok adat
persze ilyenkor a szimulátorban kikapcsolódik a terminal pipa, szal gondolom vagy ez vagy az megy.
Úgy vettem észre hogy a szimulátor kifele valóban használja a com1-emet, de befele csak billentyűzetről fogad el adatot.
Frankón műxik a megszakítás, be is olvassa a karaktert és kiírja, de nem ami a com1-en jön be hanem amit a bill.-en beütök...
Váááááá, nemértem, lehet hogy bugos a bascom progi?
A szimulátor nem erre való. Legalábbis a hardveres!
Ekkor a basmon progi van a kontrollerben, és a PCről állítgatod a memória/regisztertartalmakat. gyakorlatilag a SW futást lelassítod. _így nem lehet_ kommunikálni kifele, mert ugye a kommunikáció időfüggő! A basmon-ra keress a helpjében ott leírja...
Szóval az nem igazán az mint amire vágysz....
A mintaprogimmal mit csinál?
Esetleg a ki/bemenő soros buffer méretét szépen feljebbrakni 64-64 bytera!
Igaz a kvarcod és a soros sebességed nincs ellentmondásban, és/vagy nem a belső RC-t használod órajelforrásnak?
Options->compiler->Communication....
A sorosport miatt 19200 esetén a kvarc pl a következő lehet:
4MHz : 0,16% hiba.
11059200 MHz: OK
7372800 MHz: OK
14745600 MHz: OK
Az a 4 MHz kuka.....
Szerintem ezen (is) hasalsz el....
Ekkor a basmon progi van a kontrollerben, és a PCről állítgatod a memória/regisztertartalmakat. gyakorlatilag a SW futást lelassítod. _így nem lehet_ kommunikálni kifele, mert ugye a kommunikáció időfüggő! A basmon-ra keress a helpjében ott leírja...
Szóval az nem igazán az mint amire vágysz....
A mintaprogimmal mit csinál?
Esetleg a ki/bemenő soros buffer méretét szépen feljebbrakni 64-64 bytera!
Igaz a kvarcod és a soros sebességed nincs ellentmondásban, és/vagy nem a belső RC-t használod órajelforrásnak?
Options->compiler->Communication....
A sorosport miatt 19200 esetén a kvarc pl a következő lehet:
4MHz : 0,16% hiba.
11059200 MHz: OK
7372800 MHz: OK
14745600 MHz: OK
Az a 4 MHz kuka.....
Szerintem ezen (is) hasalsz el....
11059200 Hz -re már délután átírtam
Valószínüleg az a hiba amit mondtál, hogy a szimulátoros időzítés nem tudja beolvasni a hardveres PC soros portot.
De akkor csak úgy tesztelhetek egy progit ami bekér adatot rx-en, hogy felprogramozom, és megnézem mit csinál?
Huhh így nehezebb lesz mint szimulátorban, de megoldom mert lcd rulez:)
Na mind1 mostmár megrendelem a demopanelt, és kipróbálom hardveresen...
megyek a webshopba jól...
Valószínüleg az a hiba amit mondtál, hogy a szimulátoros időzítés nem tudja beolvasni a hardveres PC soros portot.
De akkor csak úgy tesztelhetek egy progit ami bekér adatot rx-en, hogy felprogramozom, és megnézem mit csinál?
Huhh így nehezebb lesz mint szimulátorban, de megoldom mert lcd rulez:)
Na mind1 mostmár megrendelem a demopanelt, és kipróbálom hardveresen...
megyek a webshopba jól...
A hozzászólást 1 alkalommal szerkesztették, utoljára DOGMAN 2006. szeptember 7. csütörtök, 20:56-kor.