Vhodný programovací jazyk na Winech.

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#46 Příspěvek od mtajovsky »

psychosalam píše: ... Trochu větší program se píše ve vyšším jazyce, protože, kdyby se psal v asembleru ...kdo by to zaplatil?

Je to tak, a hodně malé programy se zase většinou skriptují. Kromě toho je tu ještě otázka přenositelnosti alespoň na úrovni zdrojového kódu. Firma si nemůže dovolit psát a ladit znovu aplikaci, kterou má vyvinutou pro Intel/Linux a je v ní několik let vývoje kvůli tomu, že lukrativní zákazník má nakoupeny servery HP/HPUX nebo Sun/Solaris.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#47 Příspěvek od forbidden »

Tak už něco málo umím. Takový ty základy, umím uložit do souboru, přečíst, smazat atd... Ještě potřebuju zvládnout komunikaci s COM portem. Tak nějak mi to funguje, ale neumím inicializaci. Můj program funguje jen, když ho pustím až po nějakým jiným, který mi port inicializuje, třeba terminál, nebo jinej. Pak umím z portu číst i posílat. Na práci s portem používám jen funkce fgets, fputs, fopen... to mi stačí. Na netu jsem našel mraky informací, ale většinou pro mě nesrozumitelných. Byl by někdo ochotný poradit jak inicializovat COM port? Co nejjednodušeji. Už se v tom ztrácím. Používám Visual C++ 2010.

Díky.
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#48 Příspěvek od piitr »

Já používám funkce CreateFile, GetCommState, SetCommState, SetCommTimeouts.
Podrobnosti např. zde: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Nejde to ale asi číst tím fgets atd.
Tady je i příklad: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#49 Příspěvek od forbidden »

Díky, prostuduju to, na tento odkaz jsem ještě nenarazil.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#50 Příspěvek od mtajovsky »

Příklad otevření COM a zápisu do něj. Je to vypreparováno z větší aplikace:

Kód: Vybrat vše

OVERLAPPED  ovlp;

void open_comm()
{
int r, rcnt, tcnt=0;
char s[300];
char t[50];
char *hw;
HANDLE comm_device;                    // komunikacni handle
COMSTAT cs;
DWORD errors;

   strcpy(t, "\\\\.\\"); strcat(t, cfgdt.port);
   comm_device = CreateFile(t, GENERIC_READ|GENERIC_WRITE,
                            0, NULL, OPEN_EXISTING,
                            NULL, NULL);
   if(comm_device == INVALID_HANDLE_VALUE)    // otevri port
   {
      MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
                 MB_OK|MB_ICONEXCLAMATION);
      return;                                 // navrat pri chybe
   }

   SetupComm(comm_device, 7000L, 7000L);      // nastav I/O fronty

   strstream(s, sizeof(s), ios::out) << cfgdt.port   <<
   ":9600,n,8," << cfgdt.stopbits << ends;    // sestav retezec parametru
   if(!BuildCommDCB(s, &comm_blok))           // sestav ridici blok spojeni
   {
        MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
                 MB_OK|MB_ICONEXCLAMATION);
       CloseHandle(comm_device);               // navrat pri chybe
       comm_device = INVALID_HANDLE_VALUE;
       return;
   }

   comm_blok.fBinary = 1;                     // binarni prenos
   comm_blok.fOutxCtsFlow = 0;                // nastav pouziti signalu
   comm_blok.fOutxDsrFlow = 0;
   comm_blok.fRtsControl = RTS_CONTROL_ENABLE;// rizeni RTS
   comm_blok.fDtrControl = DTR_CONTROL_ENABLE;// rizeni DTR
   comm_blok.fDsrSensitivity = false;
   comm_blok.EvtChar = '\xff';                // nastav markant

   if(!SetCommState(comm_device, &comm_blok))
   {
      MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
                 MB_OK|MB_ICONEXCLAMATION);
      CloseHandle(comm_device);
      comm_device = INVALID_HANDLE_VALUE;
      return;
   }


   if(!SetCommTimeouts(comm_device, &comm_to))
   {
     MessageBox(MainWindowHandle, STR(ID_S_OpenCommErr), "KTA",
                 MB_OK|MB_ICONEXCLAMATION);
     CloseHandle(comm_device);
     comm_device = INVALID_HANDLE_VALUE;
      return;
    }

// ---------------------- Escape na zacatek ----------------

   WriteFile(comm_device,"A", 1,(DWORD*)&rcnt,&ovlp);
   Sleep(10);                                 // prvotni AT pro autodetekci rychlosti
   WriteFile(comm_device,"\r\n", 2,(DWORD*)&rcnt,&ovlp);
   Sleep(100);
   PurgeComm(comm_device, PURGE_RXCLEAR);  // vycisti buffery
   ClearCommError(comm_device, &errors, &cs);
   TransmitCommChar(comm_device, '\x1b');     // vysli Escape

// ----------------  zjisteni verze HW ---------------------

   main_window->hwversion->SetText("------");
   if(!write_comm("C", 1))                    // zadost o reset a uvodni retezec
   {
. . .

}

// ------------------ WRITE_COMM ---------------------------
// Funkce vysle retezec znaku do zarizeni, cekajic vzdy na echo.

bool write_comm(char* sbuf, int scnt)
{
int t;
char echo[2];
DWORD written;

   t = time(0);
   do
   {                                          // opakuj po znacich
      WriteFile(comm_device,sbuf++,1L,&written,&ovlp); // vysli 1 znak
      do
      {
         ReadFile(comm_device,echo,1L,&written,&ovlp); // cti echo
         if(written > 0)                      // echo nacteno ?
            break;                            // tak dalsi znak
         if((time(0) - t) >= 2)               // delka cekani ?
            return false;                     // vyprsel time_out
      }
      while(true);
   } while(--scnt > 0);                       // vsechny znaky
   return TRUE;                               // vysilani OK
}


Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#51 Příspěvek od forbidden »

Tak to je zrovna příklad, v čem se zatím nevyznám. Asi na to jdu moc rychle. Můj test program zatím vypadá takto:

Kód: Vybrat vše

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char znak[2];
char prijem[100];
FILE *comport;

int main()
{
   cout << "Cekam na reset procesoru..." << endl;
   comport = fopen("COM3", "r");
   if (comport==NULL)
   {
      cout << "\achyba pri otevirani portu!";
      cin.get();
      return (1);
   }
   fgets (prijem , 32 , comport);
   fclose(comport);
   cout << "prijato: " << prijem << endl;

   while (strcmp (prijem,"Prijato: K\n") != 0)      // mcu posila i konec radku
   {

   cout << "zadej znak k zapisu na COM port: ";
   cin >> znak;
   comport = fopen("COM3" , "w+");

   fputs (znak, comport);
   fflush (comport);
   fgets (prijem, 32, comport);
   fclose(comport);
   cout << "prijato: " << prijem;
   cout << "prijato celkem " << strlen(prijem) << " znaku" << endl << endl;

   }

   cin.get();
   cout << "\n\akonec programu, stiskni ENTER" << endl;
   cin.get();
   return (0);
}

Umí to komunikovat s PICem na COM portu, ale jen, když je už inicializovanej, jak jsem psal. Mám zatím projetou tu základní školu C++ na webu, plus něco naučený odsud, hlavně základy práce se soubory.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#52 Příspěvek od mtajovsky »

Takhle to jde taky, ale nemáte nad portem kontrolu. Jeho parametry se převezmou s defaultního nastavení. Chtělo by se to ponořit do Win API. Velmi dobrá kniha, zabývající se Win API, specielně jeho částí kernel je
Windows pro pokročilé a experty od J. Richtera. Nezabývá se grafikou a GUI, ale objekty jádra, pamětí, thready a tak dále.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#53 Příspěvek od Andrea »

Docela užitečný je help soubor Win32 Programmer's Reference.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#54 Příspěvek od forbidden »

WinAPI mě teprve čeká. Zatím jsem se chtěl naučit základy bez něj. Na help soubor a knížku se kouknu, ale zdá se mi celkem fousatá. Přece jenom 15 let v IT světě je věčnost. Leda by napsal nějakou revidovanou.
Konfiguraci jsem už nějak zvládl podle tohoto. Akorát to nenaroubuju na svůj program, asi to WinAPI budu muset uspíšit.
Díky za rady.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#55 Příspěvek od mtajovsky »

Kniha je uz starsi, ale práce s pamětí, thready a procesy, synchronizačními objekty (mutexy, semafory, kritické sekce), handly a tak dále je pořád stejná. Windows má nové technologie založené .NET, grafiku atd., ale tamty věci se z pohledu API nezměnily. Jinak by starší aplikace vůbec nemohly fungovat.

Pořád je možno používat dokumentaci z před-dotnetovské éry, poslední byla podzim 2001. Volání v 3 základních komponentách - KERNEL, USER a GDI jsou tam stále, taková funkce AddAtom() je tam už od Windows 2.x :) Pokud chcete používat nejnovější technologie, tak samozřejmě poslední dokumentace, ale jinak klasickou okenní "full featured" aplikaci uděláte i s 10 let starou dokumentací.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“