Pic Lab, PIC16, Experiment #18, The WIN application for COM port 

The terminal is a cool thing, but sometimes the app is more handy thing to use, plus it simply more attractive than a blank black window. At the moment I was exploring C++ Builder and decide to make a simple GUI for my devboard, so I can control it from my PC.

So, what steps should we walk to make it happen?

  • Write/find/dig the source for a program for COM port communications
  • Write the uC code
  • Make the more or less attractive GUI

The first step was the most complicated for me, my knowledge of C++ was not sufficient, so I was researching the web. Finally, I landed on the website – http://piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html, where I found not just code but also some GUI template for my first app.

Now, time to go to the uC 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 quite simple – the infinite cycle, waiting to spot symbols 1, 2, 3 or 4 and if it happened, change the LED state to inverse one.

What is left to do – to polish the GUI for my particular application. Since the app is just serving my learning purposes, I made it straightforward and simple – the area of COM initialization procedure and the LEDs area. Below, my additional strings to the sources from the piclist.ru website (the WINAPI version):

void __fastcall TForm1::CheckBox3Click(TObject *Sender)   //галочка 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);               //активировать поток записи данных в порт
 }
}

Messy, messy stuff, but it works:

1 thought on “Pic Lab, PIC16, Experiment #18, The WIN application for COM port 

  1. Pingback: Pic Lab, PIC16, Experiment #19, The WIN QT application for COM port | diymicro.org

Leave a Reply

Your email address will not be published.