Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

C++
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3779
Страница 1 от 1

Автор:  leotron [ Нед Фев 25, 2007 7:39 pm ]
Заглавие:  C++

Здравейте.
Как мога да осъществя достъп до COM порта в С++. Ползвам Dev C++ 4.9.9.2. Понеже наскоро започнах да изучавам този език за програмиране и ще съм благодарен на всеки който ми окаже помощ :D.

Автор:  juzisound [ Нед Фев 25, 2007 8:53 pm ]
Заглавие: 

Става с функцията - "CreateFile". Поразгледай за нея - не е сложно...
Ако не се оправиш - мога да ти дам малко код за C++Builder който ти ще си преправиш. Ако искаш обаче ча четеш данни от там, независимо от основната програма, тогава трябва да си създадеш отделен Thread за тая цел.

Автор:  sv_shady [ Пон Фев 26, 2007 12:10 am ]
Заглавие: 

Първо зависи дали става въпрос за win95 или winXP, ако е за 95 има си функции port_output() и port_input() Изръчкай гоогле и ще им намериш подробни описания.Ако пък става въпрос за XP нещата вече стоят по - сложно. XP не позволява пряк достъп до портовете за това трябва през kernel.dll

Автор:  Nikola Kirov [ Пон Фев 26, 2007 10:58 am ]
Заглавие: 

Не се сещам какво е това Dev 4.9.9.2

но за работа за маикрософтското C++ има доста добре направен и free клас за комуникация през серииния порт
http://www.naughter.com/serialport.html

Но и да не ползваш майкрософтското може и с малко усилия да си го направиш като за компилатора който ползваш.
Това е проста надстройка над WinApi функциите и лесно може да схванеш и как се работи директно с тях.

Автор:  leotron [ Пон Фев 26, 2007 9:00 pm ]
Заглавие: 

А някой да знае как се работи с bios.h цял ден се мъча и всеки път като напиша _bios_serialcom (3,0,0); ми изкарва че тази функция не е декларирана :?
ето и примерите които се мъча да подкарам http://www.digitalmars.com/rtl/bios.htm ... _serialcom
ползвам Borland C++ Version 5.01 :?:

Автор:  sv_shady [ Пон Фев 26, 2007 10:54 pm ]
Заглавие: 

Ами първото, което ми идва на акъл дали я имаш bios.h ???А следващото е дали пишеш на XP, защото ако е така то няма да те пунсе да бръкнеш на толкова ниско ниво !

Автор:  leotron [ Вто Фев 27, 2007 4:51 pm ]
Заглавие: 

sv_shady написа:
Ами първото, което ми идва на акъл дали я имаш bios.h ???А следващото е дали пишеш на XP, защото ако е така то няма да те пунсе да бръкнеш на толкова ниско ниво !

Ами да имам го bios.h. Чудя се обаче защо на Pascal без проблем си става комуникацията с COM порта и то под XP, а на C++ ми прави мизерии.

Автор:  [ Вто Фев 27, 2007 6:15 pm ]
Заглавие: 

_bios_serialcom функцията можеш да използваш, когато програмата ти е за DOS. В крайна сметка под XP каква програма подкарваш, DOS или Win ? COM порта за Win се програмира по различен начин за Win16 и Win32.

Автор:  paregov [ Вто Фев 27, 2007 6:30 pm ]
Заглавие: 

bios.h не се ли ползва, когато пишеш на С за COM порта?

Може да погледнеш този архив:
http://atmel.com/dyn/resources/prod_doc ... AVR231.zip

и вътре \Source Code\PC\update\comport.cpp
това се компилира на Dev C++.

Автор:  [ Вто Фев 27, 2007 8:25 pm ]
Заглавие: 

За Dev C++ не знам, но при Borland C/C++ bios.h е ориентиран за DOS.
В C++ сорса на Atmel не видях да се използват структури и/или функции от bios.h, използват се Win32 функциите CreateFile(), ReadFile(), WriteFile(), SetupComm(), SetCommState() и т.н. Тези функции не би трябвало да са дефинирани при Dev C++ в bios.h. Ето bios.h от Borland C/C++ 5.02:
Код:
/*  bios.h

    Access to bios services.

*/

/*
*      C/C++ Run Time Library - Version 8.0
*
*      Copyright (c) 1987, 1997 by Borland International
*      All Rights Reserved.
*
*/
/* $Revision:   8.1  $ */

#if !defined(__BIOS_H)
#define __BIOS_H


#if !defined(___DEFS_H)
#include <_defs.h>
#endif


#if !defined(RC_INVOKED)

#if defined(__STDC__)
#pragma warn -nak
#endif

#endif  /* !RC_INVOKED */


#ifdef __cplusplus
extern "C" {
#endif


#if !defined(_Windows)

/* diskinfo_t structure for _bios_disk() */

struct diskinfo_t
{
    unsigned drive, head, track, sector, nsectors;
    void __far *buffer;
};

/* cmd values for _bios_disk() */

#define _DISK_RESET     0   /* controller hard reset */
#define _DISK_STATUS    1   /* status of last operation */
#define _DISK_READ      2   /* read sectors */
#define _DISK_WRITE     3   /* write sectors */
#define _DISK_VERIFY    4   /* verify sectors */
#define _DISK_FORMAT    5   /* format track */

unsigned _RTLENTRY _bios_disk(unsigned __cmd, struct diskinfo_t _FAR *__dinfo);
int      _RTLENTRY biosdisk(int __cmd, int __drive, int __head, int __track,
                            int __sector, int __nsects, void _FAR *__buffer);
#endif  /* !_Windows */


#if !defined(_Windows) || defined(__DPMI16__) || defined(__DPMI32__)

/* cmd values for _bios_keybrd() */

#define _KEYBRD_READ            0       /* read key */
#define _NKEYBRD_READ           0x10    /* read key - enhanced */
#define _KEYBRD_READY           1       /* check key ready */
#define _NKEYBRD_READY          0x11    /* check key ready - enhanced */
#define _KEYBRD_SHIFTSTATUS     2       /* get shift status */
#define _NKEYBRD_SHIFTSTATUS    0x12    /* get shift status - enhanced */

/* cmd values for _bios_printer() */

#define _PRINTER_WRITE  0       /* send a byte to printer */
#define _PRINTER_INIT   1       /* initialize printer */
#define _PRINTER_STATUS 2       /* read printer status */

/* cmd values for _bios_serialcom() */

#define _COM_INIT       0       /* set communication parms to a byte */
#define _COM_SEND       1       /* send a byte to port */
#define _COM_RECEIVE    2       /* read character from port */
#define _COM_STATUS     3       /* get status of port */

/* byte values for _COM_INIT cmd of _bios_serialcom() */

#define _COM_CHR7       0x02    /* 7 data bits */
#define _COM_CHR8       0x03    /* 8 data bits */
#define _COM_STOP1      0x00    /* 1 stop bit */
#define _COM_STOP2      0x04    /* 2 stop bits */
#define _COM_NOPARITY   0x00    /* no parity */
#define _COM_EVENPARITY 0x18    /* even parity */
#define _COM_ODDPARITY  0x08    /* odd parity */
#define _COM_110        0x00    /* 110 baud */
#define _COM_150        0x20    /* 150 baud */
#define _COM_300        0x40    /* 300 baud */
#define _COM_600        0x60    /* 600 baud */
#define _COM_1200       0x80    /* 1200 baud */
#define _COM_2400       0xa0    /* 2400 baud */
#define _COM_4800       0xc0    /* 4800 baud */
#define _COM_9600       0xe0    /* 9600 baud */

unsigned _RTLENTRY _bios_keybrd(unsigned __cmd);
unsigned _RTLENTRY _bios_printer(unsigned __cmd, unsigned __port, unsigned __abyte);
unsigned _RTLENTRY _bios_serialcom(unsigned __cmd, unsigned __port, unsigned __abyte);

int      _RTLENTRY bioscom(int __cmd, char __abyte, int __port);
int      _RTLENTRY bioskey(int __cmd);
int      _RTLENTRY biosprint(int __cmd, int __abyte, int __port);

#endif  /* !_Windows || __DPMI16__ || __DPMI32__ */


#if !defined(__WIN32__) || defined(__DPMI32__)

/* cmd values for _bios_timeofday() */

#define _TIME_GETCLOCK  0   /* get clock count */
#define _TIME_SETCLOCK  1   /* set clock count */

/* Constants for biostime() */
#define _BIOS_CLOCKS_PER_SEC 18.2
#define _BIOS_CLK_TCK        _BIOS_CLOCKS_PER_SEC

/* register structure definitions for int86(), int86x() */

#ifndef _REG_DEFS
#define _REG_DEFS

struct WORDREGS
{
    unsigned int    ax, bx, cx, dx, si, di, cflag, flags;
};


struct BYTEREGS
{
    unsigned char   al, ah, bl, bh, cl, ch, dl, dh;
};

union  REGS
{
    struct  WORDREGS x;
    struct  BYTEREGS h;
};

struct  SREGS
{
    unsigned int    es;
    unsigned int    cs;
    unsigned int    ss;
    unsigned int    ds;
};

struct  REGPACK
{
    unsigned    r_ax, r_bx, r_cx, r_dx;
    unsigned    r_bp, r_si, r_di, r_ds, r_es, r_flags;
};

#endif /* _REG_DEFS */

unsigned _RTLENTRY _bios_equiplist(void);
unsigned _RTLENTRY _bios_memsize(void);
unsigned _RTLENTRY _bios_timeofday(unsigned __cmd, long _FAR *__timeval);

int      _RTLENTRY biosequip(void);
int      _RTLENTRY biosmemory(void);
long     _RTLENTRY biostime(int __cmd, long __newtime);

int      _RTLENTRY int86(int __intno,
                         union REGS _FAR *__inregs,
                         union REGS _FAR *__outregs );
int      _RTLENTRY int86x(int __intno,
                          union  REGS  _FAR *__inregs,
                          union  REGS  _FAR *__outregs,
                          struct SREGS _FAR *__segregs );

#endif  /* !__WIN32__ || __DPMI32__ */


#ifdef __cplusplus
}
#endif


#if !defined(RC_INVOKED)

#if defined(__STDC__)
#pragma warn .nak
#endif

#endif  /* !RC_INVOKED */


#endif  /* __BIOS_H */

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/