Терминал это конечно замечательно, но для своих поделок всегда хочется чего-то эстетически привлекательного. Решил я взяться потихоньку за освоение 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 мк. Эксперимент N19. Пишем приложение для COM порта с помощью QT « PIC микроконтроллеры
А где ты взял библиотеку usart.h?
А где ты взял библиотеку usart.h?
Ответь пожалуйста на мейл, а то сайт какой-то мутарный, я не могу коменты посмотреть.
Dimches2421995@mail.ru
а не, просто лагал
про уарт – здесь
эм, а можешь просто скинуть файл этот, или обязательно всю ту шляпу проделывать?
аа, не, спасибо) допер)
Да, я разобрался с этой библиотекой, теперь я запускаю программу и он мне выдаёт много ошибок в библиотеках stdio.h и htc.h. например symbol “typedef” defined more than once, syntax error, lexical error.
наверное ошибка где-то в sprintf/printf, в том архиве, что я высылал ошибок не было, только предупреждения, можешь мне еще раз скинуть архив, в котором есть ошибки, я гляну.
можешь дать свой мейл?
sargein@gmail.com