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

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

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

    • Для этого хоть бы знать что за датчик. А так из Wireshark выгрузить в CSV а потом Exel уже.
    • А че за магнит то, с торсионными синфазно-поперечными полями?  Дураков много, а стиралок выпущено еще больше, на всех хватит.
    • @AlexeyStudent Поставили стабилизатор, все работает.
    • В данном примере- конечно нет! Упор на ПЛАЗЬМУ!   Кондей брал типа МБГО (такой бурого цвета квадратик со стеклянными выводами). Думается, что если усложнить схему т.е. сделать хотьбы 5сек на разогрев спиральки Л. то она хлопнет не за 3 месяца , а подольше ...а вообще - дела "каменного века" ...наф-наф!  ;-)  , а схемка задержки уже в выключатель не влезет... В моей практике были вызовы по отключению вааще энергии в квартире ...как оказывалось  - КЗ от плазьмы вышибало центральный автомат , а хозяин , с перепугу от хлопка , больше не желал даже подойти к распред/щиту  ;-)    Увы - это основная ошибка гуру .  В однородном МП ЭДС не наводится!  Я с таким эффектом сталкивался когда сделал попытки с определением однородности материала магнита ....однородности -НИКАКОЙ ! У некоторых экземпляров неоднородность достигает до 50% !  А вот в учебниках об этом даже не заикаются  ...а теория - она без практики-ничто! ;-)  На фото : сьём ЭДС с полюса магнита индукционной катушкой . Такой сьём позволяет как бы "усилить" регистрацию эффекта и избежать шума от токосьёмов...
    • @Владислав2 Вы разницу между газоразрядными и вакуумно-люминесцентными индикаторами понимаете? Какой накал у ГРИ? У ТС ИН-14, в которых из за повышенного напряжения преобразователя 5>170 (как уже писАл@oleg_s ) пары ртути начинают светиться. У меня такое на некоторых ИН-18 наблюдалось (с шарами), но там не исправить. Насколько помню данные часы у китайцев на статике работают (и они их штампуют под все виды ГРИ, меняя панельки для установки), в теории ток сегментов замерить можно. Ну и соответственно уменьшать выходное напряжение DC-DC преобразователя, предварительно срисовав схему, там, правда плохо видно, трансформатор установлен. Либо в анодах ламп повышать сопротивления токоограничевающих резисторов на 1 выводе ИН-14. Еще как вариант, собрать свой преобразователь на MC34063 или МАХ1771 и выкинув штатный отрегулировать выходное напряжение, правда некоторые экземпляры MC от 5в не стабильно заводятся.
×
×
  • Создать...