Mam poważny problem z obsługą odbiory danych przez comport. Program wysyła dane które potrafię odebrać na uC ale nie wiem co źle napisałem ponieważ w drugą stronę nie mogę tego dokonać. Wina leży najprawdopodobniej w procedurze odbioru. A dokładniej w
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
RevS: String;
begin
ComPort.ReadStr(RevS, Count);//odczytujemy String z Portu
Memo1.Text :=Memo1.Text +Revs;//Wyswietlamy go w Memo
end;
program jest sprzężony z obsługą uC który wiem że na 100% działa.
Był testowany przez HyperTerminal
Kod, który wysyła dane do portu com z uC jest następujący.
void
UARTIntHandler(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART0_BASE, true);
UARTIntClear(UART0_BASE, ulStatus);
while(UARTCharsAvail(UART0_BASE))
{
nowy = UARTCharGetNonBlocking(UART0_BASE); //pobiera dane
zmienna[liczba]=nowy;
liczba++;
if(nowy==13)
{
RIT128x96x4Clear();
zmienna[liczba-1]=0;
sprintf(buffer, "Odebrano %s", zmienna);
RIT128x96x4StringDraw(buffer,5,50,15);
for (i=0;i<=(liczba-1);i++)
{
znak[0]=zmienna[i];
UARTCharPutNonBlocking(UART0_BASE, znak[0]); //wysyła dane w postaci char
}
liczba=0;
nowy=0;
}
// UARTCharPutNonBlocking(UART0_BASE, nowy);
}
}
//*****************************************************************************
//
// Send a string to the UART.
//
//*****************************************************************************
void
UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
//
// Loop while there are more characters to send.
//
while(ulCount--)
{
//
// Write the next character to the UART.
//
UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);
}
}
Proszę o pomoc lub podpowiedź jak odczytać dane które przesyłam do tego programu. Poniżej załączam cały kod który mam.
unit moje;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CPort, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Memo1: TMemo;
ComPort: TComPort;
Button4: TButton;
Button5: TButton;
StatusBar1: TStatusBar;
CheckBox1: TCheckBox;
procedure Button_OpenClick(Sender: TObject);
procedure ButtonSettingClick(Sender: TObject);
procedure ButtonWyslijClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
procedure ButtonKoniecClick(Sender: TObject);
procedure ComPortRxChar(Sender: TObject; Count: Integer);
// procedure ComPortClose(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button_OpenClick(Sender: TObject);
begin
if ComPort.Connected then
begin
ComPort.Close;//zamknij
Button1.Caption:='Otwórz';
end else
begin//jezeli nie jest to..
ComPort.Open; //otworz..
Button1.Caption:='Zamknij';
end;
end;
procedure TForm1.ButtonSettingClick(Sender: TObject);
begin
ComPort.ShowSetupDialog;
end;
procedure TForm1.ButtonWyslijClick(Sender: TObject);
var
S: String;
begin
S:= Edit1.Text;//Pobieramy text z Edita do zmiennej
// if CheckBox1.Checked then//jezeli checkbox jest zaznaczony
S:= S+ #13+#10;//to wysylamy to na COM w nowej linii
ComPort.WriteStr(S);//tu wysylamy
end;
procedure TForm1.ButtonClearClick(Sender: TObject);
begin
Memo1.Clear;//Czyscimy Memo
Edit1.Clear;
end;
procedure TForm1.ButtonKoniecClick(Sender: TObject);
begin
Application.Terminate;//Koniec programu
end;
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
RevS: String;
begin
ComPort.ReadStr(RevS, Count);//odczytujemy String z Portu
Memo1.Text :=Memo1.Text +Revs;//Wyswietlamy go w Memo
end;
end.
Bardzo ale to naprawdę bardzo proszę o pomoc. Jeżeli ktoś ma program który coś podobnego obsługuję to proszę zamieście go tu.
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
RevS: String;
begin
ComPort.ReadStr(RevS, Count);//odczytujemy String z Portu
Memo1.Text :=Memo1.Text +Revs;//Wyswietlamy go w Memo
end;
program jest sprzężony z obsługą uC który wiem że na 100% działa.
Był testowany przez HyperTerminal
Kod, który wysyła dane do portu com z uC jest następujący.
void
UARTIntHandler(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART0_BASE, true);
UARTIntClear(UART0_BASE, ulStatus);
while(UARTCharsAvail(UART0_BASE))
{
nowy = UARTCharGetNonBlocking(UART0_BASE); //pobiera dane
zmienna[liczba]=nowy;
liczba++;
if(nowy==13)
{
RIT128x96x4Clear();
zmienna[liczba-1]=0;
sprintf(buffer, "Odebrano %s", zmienna);
RIT128x96x4StringDraw(buffer,5,50,15);
for (i=0;i<=(liczba-1);i++)
{
znak[0]=zmienna[i];
UARTCharPutNonBlocking(UART0_BASE, znak[0]); //wysyła dane w postaci char
}
liczba=0;
nowy=0;
}
// UARTCharPutNonBlocking(UART0_BASE, nowy);
}
}
//*****************************************************************************
//
// Send a string to the UART.
//
//*****************************************************************************
void
UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
//
// Loop while there are more characters to send.
//
while(ulCount--)
{
//
// Write the next character to the UART.
//
UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);
}
}
Proszę o pomoc lub podpowiedź jak odczytać dane które przesyłam do tego programu. Poniżej załączam cały kod który mam.
unit moje;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CPort, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Memo1: TMemo;
ComPort: TComPort;
Button4: TButton;
Button5: TButton;
StatusBar1: TStatusBar;
CheckBox1: TCheckBox;
procedure Button_OpenClick(Sender: TObject);
procedure ButtonSettingClick(Sender: TObject);
procedure ButtonWyslijClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
procedure ButtonKoniecClick(Sender: TObject);
procedure ComPortRxChar(Sender: TObject; Count: Integer);
// procedure ComPortClose(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button_OpenClick(Sender: TObject);
begin
if ComPort.Connected then
begin
ComPort.Close;//zamknij
Button1.Caption:='Otwórz';
end else
begin//jezeli nie jest to..
ComPort.Open; //otworz..
Button1.Caption:='Zamknij';
end;
end;
procedure TForm1.ButtonSettingClick(Sender: TObject);
begin
ComPort.ShowSetupDialog;
end;
procedure TForm1.ButtonWyslijClick(Sender: TObject);
var
S: String;
begin
S:= Edit1.Text;//Pobieramy text z Edita do zmiennej
// if CheckBox1.Checked then//jezeli checkbox jest zaznaczony
S:= S+ #13+#10;//to wysylamy to na COM w nowej linii
ComPort.WriteStr(S);//tu wysylamy
end;
procedure TForm1.ButtonClearClick(Sender: TObject);
begin
Memo1.Clear;//Czyscimy Memo
Edit1.Clear;
end;
procedure TForm1.ButtonKoniecClick(Sender: TObject);
begin
Application.Terminate;//Koniec programu
end;
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
RevS: String;
begin
ComPort.ReadStr(RevS, Count);//odczytujemy String z Portu
Memo1.Text :=Memo1.Text +Revs;//Wyswietlamy go w Memo
end;
end.
Bardzo ale to naprawdę bardzo proszę o pomoc. Jeżeli ktoś ma program który coś podobnego obsługuję to proszę zamieście go tu.
Moderowany przez krzychoocpp:Regulamin 10.9, 11.1. Proszę napisać temat jeszcze raz po przeglądnięciu zasobów forum dotyczących omawianego problemu i po przeczytaniu regulaminu. Kod umieszczamy w znacznikach code.