Sunteți pe pagina 1din 5

Lec\ia 4.

Utilizarea PORT-ului serial


4.1. Obiectivul lec\iei

utilizarea PORT-ului serial pentru comunica\ia cu un sistem cu microcontroller.

4.2. Resurse necesare

mediul integrat Visual C++2008;


o plac[ de dezvoltare cu microcontroller conectat[ la PORT-ul serial.

4.3. Generearea proiectului


Se genereaz[ un proiect Lectia4.
Se modific[ proprietatea Text a formei ]n Com PORT.
Se adaug[ formei un obiect Label cu proprietatea Text Comanda:.
Se adaug[ formei un obiect TextBox cu propriet[\ile:
Name: txtCmd;
Font: Courier New, Font Style: Regular, Size: 10.
Se adaug[ formei un obiect Button cu propriet[\ile:
Name: btnSend;
Text: Send.
Se adaug[ formei un obiect TextBox cu propriet[\ile:
Name: txtMain;
Font: Courier New, Font Style: Regular, Size: 10;
ScrollBars: Both;
Multiline: True;
WordWrap: False.
Se adaug[ formei un obiect Button cu propriet[\ile:
Name: btnTest;
Text: Test.
Se adaug[ formei un obiect Button cu propriet[\ile:
Name: btnClear;
Text: Clear.

Figura 4.1. Fereastra Com PORT.


L4.1

Lec\ia 4. Utilizarea PORT-ului serial


Se adaug[ formei un obiect SerialPort cu propriet[\ile:
Name: serialPort1;
BaudRate 57600.
Se declar[ o variabi[ global[ de tip ]ntreg cu numele ComTimer:
/// <summary>
/// Required designer variable.
/// </summary>
static int ComTimer;

Se adaug[ formei un obiect Timer cu propriet[\ile:


Name: tmrCom;
Interval: 1.
Se completeaz[ func\ia btnClear_Click() astfel:
../***********************************************************************************
Buton Clear
Sterge fereastra txtMain
***********************************************************************************/
private: System::Void btnClear_Click(System::Object^ sender, System::EventArgs^ e)
{
txtMain->Text = "";
}//end btnClear_Click

Se completeaz[ func\ia btnSend_Click astfel:


/***********************************************************************************
Buton Send
Trimite comanda din fereastra txtCmd
***********************************************************************************/
private: System::Void btnSend_Click(System::Object^ sender, System::EventArgs^ e)
{
int errCode;
String^ res;
if(txtCmd->Text == "")
return;
errCode = SendCmd(txtCmd->Text, &res, ">");
switch(errCode)
{
case 0:
// Afiseaza rezultatul in txtMain
txtMain->AppendText(res + "\r\n");
break;
case 1:
txtMain->AppendText("Eroare deschidere PORT\r\n");
break;
case 2:
txtMain->AppendText("Time-out receptie\r\n");
break;
}//end switch
}//end btnSend_Click

Se d[ dublu-click pe tmrCom =i se completeaz[ func\ia tmrCom_Tick astfel:


/***********************************************************************************
Timer COM
***********************************************************************************/
private: System::Void tmrCom_Tick(System::Object^ sender, System::EventArgs^ e)
{
ComTimer++;
}//end tmrCom_Tick

L4.2

Lec\ia 4. Utilizarea PORT-ului serial


Se ini\ializeaz[ tmrCom astfel:
//
//TODO: Add the constructor code here
//
tmrCom->Interval = 1;
tmrCom->Enabled = true;
tmrCom->Start();

// Perioada Timer (msec.)


// Activeaza Timer
// Porneste Timer

Se define=te func\ia utilizator SendCmd() astfel:


../***********************************************************************************
Function: int SendCmd(String^ sStr, String^ *rStr, String^ wStr)
Trimite o comanda pe PORT-ul serial
Intrare: sStr - sirul comanda (fara CR)
*rStr - adresa sirului raspuns
wStr - sirul de confirmare
Valoarea returnata:
0 - fara eroare
1 - eroare deschidere PORT
2 - time-out receptie
***********************************************************************************/
int SendCmd(String^ sStr, String^ *rStr, String^ wStr)
{
String^ tmp;
int tmo;
// Constanta time-out
bool tmof;
// Semafor time-out
try
{
serialPort1->Open();
}
catch(...)
{
*rStr = "";
return 1;
}

// Deschide PORT-ul serial

// Semnaleaza eroare deschidere PORT

serialPort1->DiscardInBuffer();
serialPort1->Write(sStr + "\r");

// Goleste buffer-ul de intrare


// Transmite comanda si CR

tmo = 1000;
tmof = false;
ComTimer = 0;

// Time-out 1000 msec.

tmp = serialPort1->ReadExisting();
do
{
Application::DoEvents();
tmp += serialPort1->ReadExisting();
if(ComTimer > tmo)
tmof = true;
}while(!tmp->Contains(wStr) && !tmof);

// Asteapta sirul wStr

if(tmof)
{
if(serialPort1->IsOpen)
serialPort1->Close();

// Inchide PORT-ul

return 2;
}//end if

// Semnaleaza time-out

*rStr = tmp;
if(serialPort1->IsOpen)
serialPort1->Close();

// Salveaza raspunsul

return 0;
}//end SendCmd

// Inchide PORT-ul
// Semnaleaza fara eroare

Se alimenteaz[ placa de dezvoltare =i se conecteaz[ cablul serial ]ntre calculator =i plac[.


Se compileaz[ =i se execut[ programul.
L4.3

Lec\ia 4. Utilizarea PORT-ului serial


Se introduce ]n fereastra Comanda textul v =i se apas[ butonul Send.
}n fereastra text principal[ (txtMain) este afi=at r[spunsul pl[cii de dezvoltare la comanda v
(fig.4.2).

Figura 4.2. Rezultatul execu\iei programului (comanda v).

4.4. Structura unei aplica\ii simple


Se completeaz[ func\ia btnTest_Click astfel:
/***********************************************************************************
Buton Test
Teste
***********************************************************************************/
private: System::Void btnTest_Click(System::Object^ sender, System::EventArgs^ e)
{
String^ res;
int errCode, i;
float t;
errCode = SendCmd("T", &res, ">");
if(errCode)
{
txtMain->AppendText("Eroare comanda T\r\n");
return;
}//end if
if(res->Contains("T="))
{
i = res->IndexOf("=");
t = ::System::Convert::ToSingle(res->Substring(i+1, 7));
txtMain->AppendText("Temperatura=" + t +"\r\n");
}
else
{
txtMain->AppendText("Eroare comanda T\r\n");
}
}//end btnTest_Click

Se compileaz[ =i se execut[ programul.


La ap[sarea butonului Test, ]n fereastra text principal[ este afi=at[ temperatura (]n C).
Pentru compara\ie, se introduce ]n fereastra Comanda textul t =i se apas[ butonul Send.
Rezultatele sunt prezentate ]n figura 4.3.

L4.4

Lec\ia 4. Utilizarea PORT-ului serial

Figura 4.3. Rezultatul execu\iei programului.

L4.5