Delphi ComPort - ComTerminal + Atmega

0

Witam!

Mam problem z komponentem ComTerminal wchodzącego w skład kontrolek ComPort. Otóż założenie jest takie, aby po wciśnięciu buttona, w terminalu (ComTerminal) pojawiał się np. string do wysłania, a następnie został wysłany do urządzenia przez rs232 (w tym wypadku do Atmegi8). Po ustawieniu focusa na ComTerminal i wciśnięciu klawisza Enter, dane zostają wysłane, ale jak w procedurze buttona napiszę string + #13#10, to pomimo tego, że w terminalu karetka przejdzie do nowej linii, to żadne dane nie są wysyłane. Dopiero jak wcisnę fizycznie enter, do dane przechodzą. Czy ktoś mógłby mi pomóc?

Pozdrawiam!

0

Znaczy się chcesz tym buttonem wywoływać to coś z terminala wpisując do niego #13#10 ?
Jak dla mnie to tak wygląda...

0

Chcę wywoływać buttonem enter w terminalu, ale jeżeli jest jakaś inna możliwość niż #13#10, to jestem otwarty na propozycję.

0

daj mi źródła tej aplikacji albo komponentu co ci powiem co zrobić...

0

Ok, ale dopiero w poniedziałek. Źródła mam w pracy, ale nie mogę się coś dostać przez pulpit zdalny.
Pozdrawiam!

0

przed wyłączeniem kompa pokusiłem się na znalezienie paczki i coś takiego
ComPort.WriteStr({String z linia poleceń...});
a dalej w innej proceduże coś takiego

ComPort.WriteStr('AT'+CHR(13));

{Send modem Command}
tzn wystarczy dać string danych które chcesz wysłać i i zakończyć go Char(13) inaczej #13 tylko ;]
ale nie sprawdzałem czyli jak chcesz mieć np edit1 gdzie podajesz komende i button (Wyslij)
do do buttona musisz dać

ComPort.WriteStr(Edit1.text+CHR(13));

wiedz że nie piszę tego na trzeźwo więc nie mam pewności ;]


Z Demo Example to wziąłem ale nie testowałem...

0

Hmm, ciekawe. Może zadziałać, ale mogę to sprawdzić dopiero jutro. Dam znać czy się udało.
Dzięki i pozdrawiam!

0

Tak przy okazji: chcesz dodać znak nowej linii czy powrotu karetki? Bo Ty próbujesz wpisać dwa (jeden po drugim);

Dec Hex Oct Symbol Opis (ang.) Opis (pl)
10 A 012 LF Line Feed, new line znak nowej linii
13 D 015 CR Carrige Return znak powrotu karetki
Jeśli interesuje Cię Enter - wyślij znak #13, jeśli znak nowej linii - #10;
0

Chcę po prostu stworzyć programowo (w kodzie) enter. Aby wysłać coś przez rs muszę ręcznie wciskać enter, a ja nie chcę robić tego manualnie.

0

Jeśli chcesz to zrobić w łańcuchu - wykorzystaj znak o kodzie #13; Możesz także symulować wciśnięcie i puszczenie klawisza dzięki keybd_event:

keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
0

Witam!

Komenda ComPort.WriteStr(Edit1.text+CHR(13)) zadziałała. Myślałem, że aby coś wysłać przez rs to trzeba robić to przez ComTerminal:)). Ale teraz pojawił się następny problem. Jak korzystam z powyższej komendy, to wysyłane są tylko dwa pierwsze znaki, chociaż znaków jest więcej.

0

Dziwne to... Jakiego typu jest argument w metodzie ComPort.WriteStr()?

Jeśli używasz znaku o kodzie 13 to podaj go tak:

ComPort.WriteStr(Edit1.Text + #13)

Funkcja Chr() to przeżytek, spuścizna starego pascal'a...

0

Tak wygląda methoda. WriteStr(const Str: String): Integer, a ComPort.WriteStr(Edit.Text+#13) też próbowałem i dalej wysyła tyko dwa pierwsze znaki.

0

"Call WriteStr function to write Str variable to output buffer. The function does not return until whole string is written or timeout elapses.
The return value is the number of bytes that are actually written."

Czyli, funkcja zapisuje stringa do bufora i nie zwróci niczego, dopóki cały string nie zostanie zapisany albo minie czas oczekiwania. Zwrócona przez funkcję zmienna jest liczbą zapisanych bajtów.

To co mogę zrobić w tym przypadku, skoro w przykładzie jest podane

 Str := 'Hello';
  ComPort1.WriteStr(Str); // string type variable

?

0

Takie przykład podam

var Str:String
begin
Str := 'Hello';
 ShowMessage(Format('Wysłano %d bitów',[ComPort1.WriteStr(Str+#13)]));
end;

to ci wyśle do portu dane z Str i zwróci ilość odebranych bitów i wyświetli komunikat

0

O ile wpisując coś z palca w ComTerminalu, Bascom (zarówno jak zmienna input jest typu integer lub string) z łatwością to "łyka", to przy wysyłaniu "raw data" z ComPortu, Bascom ma problemy z interpretacją. Może trzeba przerobić "raw data" (np na kod ASCII), a może kod Bascoma, ale obawiam się, że to już wykracza poza moje umiejętności.

Dziękuję za pomoc.

0

z palca wklepujesz wolno. program wysyla to jednym ciagniem bez przerw miedzy znakami, moze dlatego sie chrzani.
pokaz kod od bascoma. swoja droga nie lubie bascoma, nie potrafie podac konkretnego przykladu dlaczego, ale czuje jakby byl niedorobiony. pokochalem arduino, niestety dziala tylko dla kilku mikrokontrolerow, dlatego teraz zaczynam czytac o C.

0

Przepraszam, że tak długo nie odpowiadałem . Załączam kod Bascom:


$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
$lib "ds1307clock.lib"
Config Sda = Portb.2
Config Scl = Portb.3

Config Portb.4 = Input
Config Portb.1 = Input

Const Ds1307w = &HD0
Const Ds1307r = &HD1

S1 Alias Pinb.4
S2 Alias Pinb.1
Portb.4 = 0
Portb.1 = 0

Portb.4 = 1
Portb.1 = 1

Dim I As Byte
Dim Znak As String * 10
Dim Znak2 As String * 2
Dim Znak4 As String * 2
Dim _sec2 As Byte
Dim _min2 As Byte
Dim _hour2 As Byte

Config Clock = User

Cls

Enable Interrupts

Cursor Off

Do
    I = Ischarwaiting()

    If I = 1 Then
       Cls
       Input Znak
       Locate 1 , 2 : Lcd Znak
       Waitms 1000
       Znak2 = Mid(znak , 4 , 2)
       Znak4 = Mid(znak , 1 , 2)
       Gosub Ustaw_czas
       Print Time$
    End If

Locate 1 , 1 : Lcd Time$

Loop

End

Dim Weekday As Byte
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day2 = Makebcd(_day2) : _month2 = Makebcd(_month2) : _year2 = Makebcd(_year2)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day2
  I2cwbyte _month2
  I2cwbyte _year2
  I2cstop
Return

Settime:
  _sec2 = Makebcd(_sec2) : _min2 = Makebcd(_min2) : _hour2 = Makebcd(_hour2)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec2
  I2cwbyte _min2
  I2cwbyte _hour2
  I2cstop
Return

Ustaw_czas:
   _hour2 = _hour
   _min2 = _min
   _sec2 = _sec
   _min2 = Val(znak2)
   _hour2 = Val(znak4)
   _sec2 = 0
   Gosub Settime
   'Goto Ustaw_czas
Return

Wczoraj spalił mi się ds1307 (nic nie wytrzyma 12V napięcia, nawet atmega:) ), więc muszę się na razie wstrzymać z testami.

Pozdrawiam!

0
Do
    I = Ischarwaiting()
 
    If I = 1 Then
       Cls
       Input Znak
       Locate 1 , 2 : Lcd Znak
       Waitms 1000
       Znak2 = Mid(znak , 4 , 2)
       Znak4 = Mid(znak , 1 , 2)
       Gosub Ustaw_czas
       Print Time$
    End If
 
Locate 1 , 1 : Lcd Time$
 
Loop

no sie nie dziwie ze nie dziala...
raz ze po "odczytaniu" znaku wstrzymujesz caly program na 1000ms=1sekundę.
dwa, że uzywasz "input" do jego odczytania - input sie stosuje w innych sytuacjach np wtedy gdy prosisz usera o wklepanie danych z klawiatury (stad w terminalu dziala). byc moze z serialem tez zadziala, nie wiem, sprawdz, chociaz wydaje mi sie ze moze znikac ten pierwszy przeslany znak. na poczatek pozbadz sie tego waitms.
zacznij uzywac pomocy: http://avrhelp.mcselec.com/index.html?input.htm
ja bym to inaczej rozwiazal:
dodaj sobie zmienna typu string, i odczytany w petli znak dodawaj do tej zmiennej. w momencie gdy otzymasz #13 nie dodawaj tego znaku tylko przejdz do analizy otrzymanej wiadomosci.

0

Dziękuję z a podpowiedź! W końcu sobie poradziłem. Zadziwiająco jest to proste. Komenda "Inkey()" pomogła.

Dziękuję i pozdrawiam wszystkich!

1 użytkowników online, w tym zalogowanych: 0, gości: 1