Experiment #18. Windows GUI for work with COM port.

Terminal is the great tool, but sometimes I want nice gui. I decided to start learning C++ Builder and made simple tool for led switching on my devboard with help RS232.

So, what steps you have to do for reach goals:

  • Write/find/get sources for work with COM port
  • Write code for microcontroller
  • Make a nice gui 🙂

First thing is most complicated for me, my C++ knowledge isn’t so good for it. Therefore I just find sources and remake it for my needs. I found it here.

Lets move to microcontroller’s code:

#include <stdio.h>
#include <htc.h>
#define _XTAL_FREQ 4000000
#include "usart.h"

__CONFIG(LVPDIS & WDTDIS & MCLREN & UNPROTECT & HS);

void main(void){
 unsigned char input;
 TRISB4 = 0; TRISB6 = 0; TRISB7 = 0; TRISB5 = 0;
 INTCON=0;    // purpose of disabling the interrupts.

 init_comms();    // set up the USART - settings defined in usart.h

 RB4 = 0;
 RB5 = 0;
 RB6 = 0;
 RB7 = 0;

 for (;;) {
 input = getch();

 switch (input) {
                 case 49 : RB4 = !RB4;
                           break;
                 case 50 : RB5 = !RB5;
                           break;
                 case 51 : RB6 = !RB6;
                           break;
                 case 52 : RB7 = !RB7;
                           break;
                 }

 }

}

The code is very simple, just infinite cycle in which we wait until 1, 2, 3, or 4 button is pressed, if so, then change led state on opposite.

Next thing is changing gui in sources:


void __fastcall TForm1::CheckBox3Click(TObject *Sender)   //label L4
{
 if (Form1->CheckBox3->Checked == true) {
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"1");      //занести в программный передающий буфер 1
 ResumeThread(writer);               //активировать поток записи данных в порт

 Label7->Caption="1"; }

 else  {
 Label7->Caption="0";
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"1");      //занести в программный передающий буфер 1
 ResumeThread(writer);               //активировать поток записи данных в порт
 }

}

void __fastcall TForm1::CheckBox4Click(TObject *Sender)  //галочка L5
{
 if (Form1->CheckBox4->Checked == true) {
 Label8->Caption="1";
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"2");      //занести в программный передающий буфер 2
 ResumeThread(writer);               //активировать поток записи данных в порт

 }

 else
 {
 Label8->Caption="0";
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"2");      //занести в программный передающий 2
 ResumeThread(writer);               //активировать поток записи данных в порт
 }
 }

void __fastcall TForm1::CheckBox5Click(TObject *Sender)   //галочка L6
{
 if (Form1->CheckBox5->Checked == true) {
 Label9->Caption="1";
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"3");      //занести в программный передающий буфер 3
 ResumeThread(writer);               //активировать поток записи данных в порт

 }

 else {
 Label9->Caption="0";
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"3");      //занести в программный передающий буфер 3
 ResumeThread(writer);               //активировать поток записи данных в порт

 }
}

void __fastcall TForm1::CheckBox6Click(TObject *Sender)  //галочка L7
{
 if (Form1->CheckBox6->Checked == true) {
 Label10->Caption="1";
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"4");      //занести в программный передающий буфер 4
 ResumeThread(writer);               //активировать поток записи данных в порт

 }

 else
 {
 Label10->Caption="0";
 memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта
 strcpy(bufwr,"4");      //занести в программный передающий буфер 4
 ResumeThread(writer);               //активировать поток записи данных в порт
 }
}

Not very clear, but it works 🙂


			

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.