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

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. Может быть кто то по другому делал . все варианты принимаются

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

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

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

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

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
Ссылка на комментарий
Поделиться на другие сайты

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

+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 пользователей онлайн

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

    • В данной схеме, при прочих равных условиях, выделяющаяся на транзисторе мощность от его "фирменности" не зависит, это же не импульсник какой. Эффект ожидания наблюдателя.
    • Зачем же пугать человека? Он же правильно мыслит. Вопрос чтобы правильно все сделал. Гальванику...
    • Вероятно, в разделе "Работа" вам помогут. При условии предоставления чёткого и недвусмысленного технического задания.
    • Привет кто это еще читает. Знакомый купил в Москве по адекватной цене пару  B615D, дал на диагностику перед уверенной эксплуатацией. Одна сразу в защите, большой динамик спален, усилители на высокоомную нагрузку поют, буду позже разбираться. А вот вроде бы вполне работоспособная не сдюжила и 10 минут на хорошей мощности на плотном прогрессиве. Вылетели ключи в БП и драйвера на MMBTA56. Видно что был в ремонте, возможно ключи оказались палёнкой. Есть мысль впаять вместо FQPF13N50  чуток помощней по току 18N50-e. По параметру Qg аналогичные, а по  Сg будут потяжелей, 2350пф против 1800 у 13н50-х. 
    • Ну так теперь фигня вопрос. Проверить, что кнопки невозможно замкнуть одновременно, да определить, на какой ток транзисторы нужны. По характеристикам мотора или по максимально-допустимому току диодов D1-D4. Навскидку, моторчик низковольтный, диоды тоже. Транзисторы тогда на PBSS4350 можно заменить. Они на Али почти задаром продаются.
    • Сами же понимаете, что так не может быть. Или нет "сквозняка", или схема неправильно собрана, элементы не те, битые и пр., и схема защиты не работает. Проверьте сначала работу защёлки защиты при питании от 15 В, отпаяв R19 и подавая туда медленно увеличивающееся напряжение до 1,5 - 2 В (можно с потенциометра ом на 100-500). Добейтесь, чтобы работала. Порог срабатывания измерьте. Пересчитайте в ток через резистор 0,1 Ом. Соответствует ли "правильному"? Проверьте, что у этого резистора сопротивление действительно 0,1 Ом. Запаяйте 0,1 Ом обратно. Напишите, какая лампочка. А то мало ли какая, может она не от "сквозняка", а от броска тока заряда С18 С16 мигает. Транзисторы ключей проверьте. Впаяйте вместо первичной трансформатора резистор ом 150 - 300, чтобы ток с ключей в этот "эквивалент трансформатора" не больше 50-100 мА был. Посмотрите форму напряжения на выходе ключей, в точке соединения С16 и С18, на питании после лампочки. Ищите, где ляп. Умозрительно подсказать можно только по каким-то измеренным данным. Кроме вас никто их не добудет. В общем, как в анекдоте: - Молодой человек, ну делайте же уже хоть что-нибудь!
    • Ну так можно увеличить глубину ООС, тем самым понизив чувствительность и повысив линейность
×
×
  • Создать...