Перейти к содержанию

Usart И Терминал Пк . Общение Пк С Контроллером.


DVyacheslavN

Рекомендуемые сообщения

Здравствуйте в этой теме хотел поговорить о совместной работе пк и контроллера по RS485. Задача следующая пояснить как организовать список команд в контроллере которые выполняли бы определенные действия после посылки через терминал Имя этой команды. и получение ответа в конце выполнения. Для начало привожу пример кода

/************************Сравнение массивов************/

bit ArrayCompare (char x[10], char ref[10] ) {

//

char i=0;

char bt=1;

if (x!=0) {

while (ref != '\0') {

if (x==ref) bt=1&&bt;

else bt=0&&bt;

i++;

}

}

if (bt) return 1 ;

if(bt!=1)return 0;

}

/*********** сравниваемые переменные***************** */

char VariableCompare (char x [50]) {

char Bstp=0;

const char

vari[30]={"|WRITE||READ|!"}; команды которые которые доступны через терминал

char numComm=0;

char ty[10];

char i=0;

do {

if (vari=='|' && vari[i+1]=='|') { если || то +1 к счетчику

numComm++;

}

if (vari=='|' && vari[i+1]!='|') { если |W (короче если после символа | появляется текст то присвоить этот тест строковому массиву ty[10])

i++;

while (vari!='|'){

ty[10]=vari;

i++;

}

}

if (vari=='\0'){ если |! конец архива команд вернет 255

Bstp=1;

numComm=255;

}

i++;

}while (ArrayCompare(x[10], ty[10]) || Bstp ); Пока Сравниваемые массивы (тобиш одна из команд контроллера и команда терминала не совпадут или не дастигнут конец массива команд делать выше сказанную хренатень. )))

return numComm;

}

он не совсем правильно работает .

Логика следующая я получил какую то текстовю переменную (команду) например "WRITE" из буфера при запуске функциии Variable Compare эту текстовую команду я должен найти в "vari[30]" при этом команды в строковом массиве разделены || а конец массива |! сравнивать естественно я должен по буквам начиная с 2 символа в массиве |WRITE||READ|! также должен быть счетчик команд. если команда WRITE есть то возвращает 1 если команда READ есть то возвращает 2 то есть || при переходе этих двух символов счетчик должен увеличиваться на 1 и если сравнение удачно то вернет 2. Может быть кто то по другому делал . все варианты принимаются

Ссылка на комментарий
Поделиться на другие сайты

Если хотите работать с текстовыми командами , то можно просто воспользоваться стандартными функциями. Например так:

#include <iostream>
using namespace std;
int main() {
char comWrite[] = "WRITE";
char comRead[] = "READ";
char comExit[] = "EXIT";
char *com = new char[10];
while(1) {
 cout << "Введите команду: ";
 cin >> com;

 if (!strcmp(com, comWrite)) {
  cout << 1 << endl;
 } else if (!strcmp(com, comRead)) {
  cout << 2 << endl;
 } else if (!strcmp(com, comExit)) {
  cout << 3 << endl;
  break;
 } else {
  cout << 0 << endl;
  break;
 }
}
return 0;
}

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну в общем понятен код только вот при добавлении новой команды придется добавлять еще условия IF а в коде который я выложил только дописать команду в массив . только я еще не довел его до ума.

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ниже код проверяет последовательно все команды в массиве. Но в любом случае обработчик для новой команды писать надо.

int main() {
char comText[] [10] = {
"WRITE",
"READ",
"EXIT"
};

char *comName = new char[10];
char com = 0;

while (1) {

cout << "Введите команду:";
cin >> comName;

for(com = 0; com < sizeof(comText)/sizeof(comText[0]); com++) {
cout << comName << " , " << (com+'0') << " , " << comText[com] << endl;
if (!strcmp(comName, comText[com])) {
com++;
break;
}
}

cout << (com+'0') << endl;

if (com == 1) {
cout << 1 << endl;
} else if (com == 2) {
cout << 2 << endl;
} else if (com == 3) {
cout << 3 << endl;
break;
} else {
cout << 0 << endl;
break;
}
}
return 0;
}

Изменено пользователем BerZerKku
Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Элегантно !!!

+1

Я так понял, это - сарказм ? :)

BerZerKku, Вы, похоже, "номером ошиблись". Чел прогает для МК, и я не думаю, что на плюсах :)

Какие нафиг cout и cin ? Одумайтесь и не давайте подобных кусков кода... :)

Ссылка на комментарий
Поделиться на другие сайты

Ну в принципе у сишных языков много общего вобше ANSI C, подправить немного код это не проблема. как говориться на безрыбье и рак рыба.

Ниже код проверяет последовательно все команды в массиве. Но в любом случае обработчик для новой команды писать надо.

int main() {
char comText[] [10] = {
"WRITE",
"READ",
"EXIT"
};

char *comName = new char[10];
char com = 0;

while (1) {

cout << "Введите команду:";
cin >> comName;

for(com = 0; com < sizeof(comText)/sizeof(comText[0]); com++) {
cout << comName << " , " << (com+'0') << " , " << comText[com] << endl;
if (!strcmp(comName, comText[com])) {
com++;
break;
}
}

cout << (com+'0') << endl;

if (com == 1) {
cout << 1 << endl;
} else if (com == 2) {
cout << 2 << endl;
} else if (com == 3) {
cout << 3 << endl;
break;
} else {
cout << 0 << endl;
break;
}
}
return 0;
}

Только вот include не написал sizeof откуда взял ?? и опять же этой инструкции может и не быть в МК

if (com == 1) {

cout << 1 << endl;

} else if (com == 2) {

cout << 2 << endl;

} else if (com == 3) {

cout << 3 << endl;

break;

} else {

cout << 0 << endl;

break;

}

}

return 0;

}

вот этот кусок кода можно на Switch поменять проще будет.

Ссылка на комментарий
Поделиться на другие сайты

sizeof откуда взял ?? и опять же этой инструкции может и не быть в МК
sizeof - стандартная Сишная функция (ну или макрос, кому как удобнее) взятия размера объекта. К ней никакой инклюд не нужен, и тем более никакой подобной инструкции в МК быть не может, это дело компилятора.
подправить немного код это не проблема
Громкое заявление, учитывая Ваши посты и код вначале топика :)

Ну чтож, тогда могу только пожелать удачи ! :)

Ссылка на комментарий
Поделиться на другие сайты

BerZerKku, Вы, похоже, "номером ошиблись". Чел прогает для МК, и я не думаю, что на плюсах :)

Какие нафиг cout и cin ? Одумайтесь и не давайте подобных кусков кода... :)

Не вижу ничего криминального, это всего-лишь реализация алгоритма. Откуда берутся данные и что находится в обработчиках уже никого волновать не должно. А уж что выбрать для МК С или С++ это отдельная тема для разговора. Изменено пользователем BerZerKku
Ссылка на комментарий
Поделиться на другие сайты

да не спорю в программировании я не ас но коды четать умею и представлять как они работают. у меня есть вторая тема по повод SD карт и МК может вы бы поделились наработками по этому вопросу.

Ссылка на комментарий
Поделиться на другие сайты

) в этом плане у меня все плохо. Железо для отладки приготовил, но пока реальной необходимости нет и разбираться с программной частью лень.

Ссылка на комментарий
Поделиться на другие сайты

Сижу мучаю Borland C++ нашёл ошибку в коде который выложил .

if (vari=='|' && vari[i+1]!='|') { если |W (короче если после символа | появляется текст то присвоить этот тест строковому массиву ty[10])

i++;

while (vari!='|'){

ty[10]=vari; место этого должно быть ty[i-1]=vari;

i++;

теперь VariableCompare работает так ка нужно . позже попробую скомпилировать для МК.

проблема то была в том что массив ty[10 ] должен был быть заполнен строкой и отправлен в ArrayCompare а он у меня не заполнялся вот код который правлеьно заполняет массив ty[10 ] без символа |

#include <iostream>

void main () {

char x[] ="";

char Bstp=0;

const char

vari[30]={"|WRITE||READ|!"};

char numComm;

char ty[10]="12";

char i=0;

do {

numComm=0;

cout << "VVedite komandy" ;

cin >> x ;

if (vari=='|' && vari[i+1]=='|' ) {

}

if (vari=='|' && vari=='|') {

numComm++;

}

if (vari=='|' && vari[i+1]!='|') {

i++;

while (vari!='|'){

ty[i-1]=vari;

i++;

}

}

if (vari=='\0'){

Bstp=1;

numComm=4;

}

i++;

cout << ty << endl ;

cout << numComm << endl ;

}while ( 1 );

}

Ссылка на комментарий
Поделиться на другие сайты

void print (int x);

char ArrayCompare (char x[10] , char ref[10]);

char VariableCompare (char x [50]);

int main () {

char x[20]={"READ"} ;

print (VariableCompare(x));

}

char ArrayCompare (char x[10], char ref[10] ) {

//

char i=0;

char bt=0;

if (x!=0 && ref!=0) {

bt=1;

while (ref != '\0') {

if (x==ref) bt=1&&bt;

else bt=0&&bt;

i++;

}

}

if (bt) return 1 ;

if(bt!=1)return 0;

}

char VariableCompare (char x [50]) {

char Bstp=0;

const char vari[30]={"||WRITE||READ||END||"};

char numComm=0;

char ty[10]={""};

char skbt=0;

char i=0;

do {

if (vari=='|' && vari[i+1]=='|') {

numComm++;

i++;

skbt=1;

}

if (vari=='|' && vari[i+1]!='|' && !skbt) {

i++;

char g=0;

while (ty[g]!='\0' ){

ty[g]='\0';

g++;

}

g=0;

while (vari!='|' ){

ty[g]=vari;

g++;

i++;

}

}

if (vari[i+1]=='\0'){

Bstp=1;

numComm=4;

}

skbt=0;

}while ((ArrayCompare(x, ty) || Bstp)==0 );

return numComm;

}

void print (int x) {

std::cout << x << std:: endl;

}

все отладил работу своего кода . ))

и в протеусе проверил все гуддд

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

#include <pic.h>
#include <InitWriteRead.c>
#include <compare_text.c>
#include <Usart_terminal_Un.c>
char SPI (char d);
//********************************************************************
char SPI(char d) // Передача по SPI-интерфейсу
{
SSPBUF=d;
while (!BF); // Ожидание окончания передачи
return SSPBUF; // и одновременно принимаем
}
//**********************************************************************
void main(void)
{
INTCON=0; // Отключить прерывания
ADCON1=0x6; // PortA как цифровые выходы
TRISC=0b11010011; // sck rc3-0, sdo rc5-0, CS rc2-0.
TRISB=0b00000010; // RB2>TX, RB1>RX
InitUSART(); // Инициализация последовательной передачи данных
SerString("Ich bin ON "); // Стартовое сообщение
if (MMC_Init()) SerString("MMC ON "); // Инициализация MMC и сообщение, если всё нормально!
while (1){
if (RCIF || TXIF ) RCp();
switch (Ncommand) {
case 1 :
SerString ("...WRITE...");
break;
case 2 :
SerString ("...READ...");
break;
case 3 :
SerString ("...END...");
break;
case 4 :
SerString ("error command");
TXREG ='\r','\n','\0';
break;
}
Ncommand =0;
}
}

 
#include <pic.h>
unsigned char CharOutIndex = 0;
unsigned char CharInIndex = 3;
unsigned char SingleCharFlag = 0;  //Для передачи одного символа строки
extern void write (char x);
char StringOut[10] = "fds";
void SerString(const char *str);
char Ncommand =0;
void RCp (void);
char Srav (char x[10]);
void RCp (void) {
unsigned char temp;
if (RCIF) { //если запрос на прерывание получен от приемника:
 if ((temp = RCREG) < 0x020) // получен управляющий символ
  if (temp == 0x008) //этот символ backspace
if (CharInIndex > 0) {

}else;
  else if (temp == 0x0d) { //enter -конец строки

 StringOut[CharInIndex++] = '\r';	
 StringOut[CharInIndex++] = '\n';
 StringOut[CharInIndex] = '\0'; 
 CharInIndex = 0;
 CharOutIndex = 0;
TXREG='\r','\n','\0';
//SerString (StringOut);
Ncommand = VariableCompare (StringOut);
StringOut[10]="";
}
else;
 else {	    // Обычные символы ASII
  if ((temp >= 'a') && (temp <= 'z'))
 temp -= ('a' - 'A');
  if (CharInIndex < 23) { //отправить назад
StringOut[CharOutIndex = CharInIndex] = temp;
StringOut[++CharInIndex] = '\0';
   // Символ конца строки
TXIF = 1;
SingleCharFlag = 1;
if ((temp = StringOut[CharOutIndex]) == '\0'){
TXIF = 0;

}
else {
  TXREG = temp;	  //вывод очередного символа
  CharOutIndex++;  //передвинуть указатель к следующему символу
}}}
RCIF = 0;    //сбросить флаг прерывания.
}}
void SerString(const char *str)
{
char ps;
ps=*str;
while (ps>0)
{
*str++;
if (ps==0) break;
while (!TXIF);
TXREG=ps;
ps=*str;
}
}

 

/************************Сравнение массивов************/
char ArrayCompare (char x[10], char ref[10] ) {
char i=0;
char bt=0;
if (x[i]!=0 && ref[i]!=0) {
bt=1;
while (ref[i] != '\0') {
if (x[i]==ref[i]) bt=1&&bt;
else bt=0&&bt;
i++;
}}
if (bt) return 1 ;
if(bt!=1)return 0;
}
/*********** сравниваемые переменные*****************/

char VariableCompare (char x [50]) {
const char CompComm[30]={"||WRITE||READ||END||"};
char Bstp=0;

char numComm=0;
char ty[10]={""};
char skbt=0;
char i=0;
do {
if (CompComm[i]=='|' && CompComm[i+1]=='|') {
numComm++;
i++;
skbt=1;
}
if (CompComm[i]=='|' && CompComm[i+1]!='|' && !skbt) {
i++;
char g=0;
while (ty[g]!='\0' ){
ty[g]='\0';
g++;
}
g=0;
while (CompComm[i]!='|' ){
ty[g]=CompComm[i];
g++;
i++;
}
}
if (CompComm[i+1]=='\0'){
Bstp=1;
numComm=4;
}

skbt=0;
}while ((ArrayCompare(x, ty) || Bstp)==0 );
return numComm;
}

Выложил коды программы для общения микроконтроллера и компютера , будет полезно комунебудь . настройки usart многие занют поэтому не стал их выкладывать.

Ссылка на комментарий
Поделиться на другие сайты

))))

че думаешь перегреется . и взорвется :bomb: не думаю что все так плохо . темболее половину я взял из книжных источников. да при моделировании загрузка пика низкая. хотя одно можно исправить обработку usarta в прерывания запихать.

да и памяти еще завались )) осталось

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...
скиньте ссылку на материал.
http://os24.org/file...Language-RU.pdf

Собственно, эта книга должна быть настольной. В ней быстрее можно найти ответы на многие вопросы, чем ждать пока ответят на форуме.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

получается что в подключаемой бибилиотеки функции нет а когда я залез в нее то увидил следущее

#if defined(_PIC16)
extern unsigned char  sprintf(far char *, const char *, ...);
#else /* _PIC16 */
extern unsigned char  sprintf(char *, const char *, ...);
#endif
#if defined(_PIC18)
extern int printf(const char *, ...);
#else
extern unsigned char printf(const char *, ...);
#endif
#else /* _MPC_ */
extern char * gets(char *);
extern int puts(const char *);
extern int scanf(const char *, ...);
extern int sscanf(const char *, const char *, ...);
extern int  vprintf(const char *, va_list);
extern int vsprintf(char *, const char *, va_list);
extern int vscanf(const char *, va_list ap);
extern int vsscanf(const char *, const char *, va_list);

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

вот модифицировал кот проверки строк . теперь можно привязаться к i и вперед . ))

#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include <string.h>
#define _HOSTED =1
#define MAXLINE 15
extern void init_comms();
int getline(char s[], int lim);
char comTEXT[5] [10]= {"INIT", "WRITE", "READ"};
/*
*
*/
int main(int argc, char** argv) {
int gdd, fg = 255;
char text[MAXLINE] = {""};
int d = 0;
init_comms();
while (1) {

 while ((d = getline(text, MAXLINE)) > 0) {
	 if (text[d--] == '\r') {
		 text[d] = '\0';

int i;
		 for ( i=0;(fg=strcmp(comTEXT[i], text))!=0 && i<3; i++);
		 printf ("%d %d", fg , i);
	 }
 }
}
return (EXIT_SUCCESS);
}
int getline(char s[], int lim) {
int c, i = 0;
while (--lim > 0 && (c = getchar()) != EOF && c != '\r')
 s[i++] = c;
if (c == '\r')

 s[i++] = c;
s[i] = '\r';
return i;
}

Изменено пользователем DVyacheslavN
Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

Всем , здрасти, решил выложить свою прогу . :umnik2: работает с командами формата # далее номер команды ^-запись в буфер если треб и | - коней команды . жду критику. )) может что подскажете , также вложил фай proteus . чтобы заработал терминал надо набрать команду #15| в слепую :bomb: . ссылка http://rghost.ru/pri...a9a9a249b55fbcc

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...