PIC мк. Эксперимент №18. Windows приложение для работы с COM портом.

Терминал это конечно замечательно, но для своих поделок всегда хочется чего-то эстетически привлекательного. Решил я взяться потихоньку за освоение C++ Builder и сварганил программку для включения светодиодов на моей devboard с помощью интерфейса компьютера.

Итак, какие нужно предпринять шаги, чтобы получить описанные возможности:

  • Написать/найти/раздобыть исходники программы  для работы с ком портом компьютера
  • Написать прошивку для микроконтроллера
  • Создать эстетически выдержанный интерфейс для приложения под винду

С первым пунктом сложнее всего. Мне мои знания C++ пока что к сожалению не позволяли написать программу самому, поэтому я решил ее найти и переделать под свои нужды. То что мне нужно я нашел по этому адресу http://piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html. При этом раздобыв не только исходники работы с разъяснениями что куда тыкать, но и получив при этом заготовку формы для своего первого приложения.

Исходник у нас есть, описывать я ничего оттуда не буду, т.к. оно все уже описано по вышеприведенной ссылке. Переходим к прошивке для микроконтроллера:

#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;
                 }

 }

}

Код довольно прост – ждем в бесконечном цикле появления на входе уарта символов “1”, “2”, “3” или “4” и если данное событие произошло, меняем состояние светодиода на противоположное.

Далее осталось заточить под себя интерфейс программы. Так как программа ознакомительная и ее функцией является просто дергание состоянием светодиодов, то интерфейс предельно прост – область инициализации порта и область включения выключения светодиодов. Ниже мои добавления в исходники piclist.ru (версия с использованием WINAPI):


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);               //активировать поток записи данных в порт
 }
}

Муторно конечно, но работает

PIC мк. Эксперимент №18. Windows приложение для работы с COM портом.: 11 комментариев

  1. Уведомление: PIC мк. Эксперимент N19. Пишем приложение для COM порта с помощью QT « PIC микроконтроллеры

  2. эм, а можешь просто скинуть файл этот, или обязательно всю ту шляпу проделывать?

    Ответить

  3. Да, я разобрался с этой библиотекой, теперь я запускаю программу и он мне выдаёт много ошибок в библиотеках stdio.h и htc.h. например symbol “typedef” defined more than once, syntax error, lexical error.

    Ответить

  4. наверное ошибка где-то в sprintf/printf, в том архиве, что я высылал ошибок не было, только предупреждения, можешь мне еще раз скинуть архив, в котором есть ошибки, я гляну.

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">