اطلاعیه

Collapse
No announcement yet.

اینترفیس با ا¾c++یاVisual C++

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : اینترفیس با ا¾c++یاVisual C++

    سلام.
    باتشکر از لطفتون ولی با راست کلیک در toolbox(اگه منظورتون بخش مربوط به کنترل ها باشه) گزینه ای به نام choos Item پیدا نکردم.
    لطفا ببیشتر توضیح بدید.

    شاید شما با visual.net کار می کنید.

    باتشکر

    دیدگاه


      #17
      پاسخ : اینترفیس با ا¾c++یاVisual C++

      سلام
      بله من با VS.NET گفتم ، تو VC6 فکر کنم باید از منوی Insert گزینه ی ActiveX یا یه همچین چیزایی پیدا کنید ، خیلی وقته با VC6 کار نکردم ، درست خاطرم نیست ولی به احتمال زیاد تو منوها می تونید پیداش کنید .
      حضرت علی (ع) : خداوند از جاهلان پیمان فراگیرى علم نگرفته ، مگر آنکه قبلا از دنشمندان پیمان تعلیم دادن گرفته است .

      دیدگاه


        #18
        پاسخ : اینترفیس با ا¾c++یاVisual C++

        سلام!!
        اینم header فایلش، حالشو ببر!
        .CPP
        // SyncSerialComm.cpp: implementation of the CSyncSerialComm class.
        //
        //////////////////////////////////////////////////////////////////////

        #include "SyncSerialComm.h"

        #include <string.h>
        #include <assert.h>

        #include <sstream>

        //////////////////////////////////////////////////////////////////////
        // Construction/Destruction
        //////////////////////////////////////////////////////////////////////

        CSyncSerialComm::CSyncSerialComm(const char *pszPortName)
        : m_hSerialComm(INVALID_HANDLE_VALUE)
        {
        assert(pszPortName);

        m_pszPortName = new char[strlen(pszPortName)];
        strcpy(m_pszPortName, pszPortName);
        }

        CSyncSerialComm::~CSyncSerialComm()
        {
        if(m_pszPortName)
        delete[] m_pszPortName;

        Close();
        }

        //////////////////////////////////////////////////////////////////////
        // Name: Open
        // Version: 1.0
        // Return: HRESULT
        // Comment: This function is used open a connection with a serial port.
        // Uses non-overlapped i/o, and allows for reading & writing to the
        // port.
        //////////////////////////////////////////////////////////////////////

        HRESULT CSyncSerialComm::Open()
        {
        HRESULT hResult;

        m_hSerialComm = CreateFile(m_pszPortName, /* Port Name */
        GENERIC_READ | GENERIC_WRITE, /* Desired Access */
        0, /* Shared Mode */
        NULL, /* Security */
        OPEN_EXISTING, /* Creation Disposition */
        0,
        NULL); /* Non Overlapped */

        if(m_hSerialComm == INVALID_HANDLE_VALUE)
        {
        unsigned long error = ::GetLastError();
        hResult = E_FAIL;
        }

        else
        hResult = S_OK;

        return hResult;
        }

        //////////////////////////////////////////////////////////////////////
        // Name: Close
        // Version: 1.0
        // Return: HRESULT
        // Comment: This function is used to close the serial port connection
        // Note: This function is called with the destructor
        //////////////////////////////////////////////////////////////////////

        HRESULT CSyncSerialComm::Close()
        {
        if(m_hSerialComm != INVALID_HANDLE_VALUE)
        {
        CloseHandle(m_hSerialComm);
        m_hSerialComm = INVALID_HANDLE_VALUE;
        }

        return S_OK;
        }

        //////////////////////////////////////////////////////////////////////
        // Name: ConfigPort
        // Version: 1.0
        // Parameter: dwBaudRate - This must be set to the baud rate of the
        // serial port connection otherwise invalid reads occur.
        // dwTimeOutInSec - Specifies the timeout for read and write of the serial
        // port connection in seconds
        // Return: HRESULT
        // Comment: This function is used configure the serial port connection.
        //////////////////////////////////////////////////////////////////////

        HRESULT CSyncSerialComm::ConfigPort(DWORD dwBaudRate, DWORD dwTimeOutInSec)
        {
        if(!SetupComm(m_hSerialComm, 1024, 1024))
        return E_FAIL;

        DCB dcbConfig;

        if(GetCommState(m_hSerialComm, &dcbConfig)) /* Configuring Serial Port Settings */
        {
        dcbConfig.BaudRate = dwBaudRate;
        dcbConfig.ByteSize = 8;
        dcbConfig.Parity = NOPARITY;
        dcbConfig.StopBits = ONESTOPBIT;
        dcbConfig.fBinary = TRUE;
        dcbConfig.fParity = TRUE;
        }

        else
        return E_FAIL;

        if(!SetCommState(m_hSerialComm, &dcbConfig))
        return E_FAIL;

        COMMTIMEOUTS commTimeout;

        if(GetCommTimeouts(m_hSerialComm, &commTimeout)) /* Configuring Read & Write Time Outs */
        {
        commTimeout.ReadIntervalTimeout = 1000*dwTimeOutInSec;
        commTimeout.ReadTotalTimeoutConstant = 1000*dwTimeOutInSec;
        commTimeout.ReadTotalTimeoutMultiplier = 0;
        commTimeout.WriteTotalTimeoutConstant = 1000*dwTimeOutInSec;
        commTimeout.WriteTotalTimeoutMultiplier = 0;
        }

        else
        return E_FAIL;

        if(SetCommTimeouts(m_hSerialComm, &commTimeout))
        return S_OK;

        else
        return E_FAIL;
        }

        //////////////////////////////////////////////////////////////////////
        // Name: Read
        // Version: 1.0
        // Parameter: ppszBuf - The buffer that will have the value that was
        // read in from the serial port.
        // dwSize - The size of the buffer
        // Return: HRESULT
        // Comment: This function sets an event that will be signalled if the
        // any byte is buffered internally. Once this occurs, the function keeps
        // reading multiple a single byte at a time until there is no more furthur
        // byte to read from the input stream
        //////////////////////////////////////////////////////////////////////

        HRESULT CSyncSerialComm::Read(char **ppszBuf, DWORD &dwSize)
        {
        HRESULT hResult = S_OK;
        std::stringbuf sb;
        DWORD dwEventMask;

        if(!SetCommMask(m_hSerialComm, EV_RXCHAR)) /* Setting Event Type */
        return E_FAIL;

        if(WaitCommEvent(m_hSerialComm, &dwEventMask, NULL)) /* Waiting For Event to Occur */
        {
        char szBuf;
        DWORD dwIncommingReadSize;

        do
        {
        if(ReadFile(m_hSerialComm, &szBuf, 1, &dwIncommingReadSize, NULL) != 0)
        {
        if(dwIncommingReadSize > 0)
        {
        dwSize += dwIncommingReadSize;
        sb.sputn(&szBuf, dwIncommingReadSize);
        }
        }

        else
        {
        unsigned long error = ::GetLastError();
        hResult = E_FAIL;
        break;
        }

        } while(dwIncommingReadSize > 0);

        *ppszBuf = new char[dwSize];
        strcpy(*ppszBuf, (sb.str()).c_str());

        return hResult;
        }

        else
        return E_FAIL;
        }

        //////////////////////////////////////////////////////////////////////
        // Name: Write
        // Version: 1.0
        // Parameter: szBuf - The buffer holding the bytes to write to the serial
        // port connection
        // dwSize - The size of the buffer
        // Return: HRESULT
        // Comment: This function writes one byte at a time until all the bytes
        // in the buffer is sent out
        //////////////////////////////////////////////////////////////////////

        HRESULT CSyncSerialComm::Write(const char *pszBuf, DWORD dwSize)
        {
        HRESULT hResult = S_OK;

        assert(pszBuf);

        unsigned long dwNumberOfBytesSent = 0;

        while(dwNumberOfBytesSent < dwSize)
        {
        unsigned long dwNumberOfBytesWritten;

        if(WriteFile(m_hSerialComm, &pszBuf[dwNumberOfBytesSent], 1, &dwNumberOfBytesWritten, NULL) != 0)
        {
        if(dwNumberOfBytesWritten > 0)
        ++dwNumberOfBytesSent;
        else
        {
        unsigned long error = ::GetLastError();
        hResult = E_FAIL;
        break;
        }
        }

        else
        {
        unsigned long error = ::GetLastError();
        hResult = E_FAIL;
        break;
        }
        }

        return hResult;
        }

        //////////////////////////////////////////////////////////////////////
        // Name: Flush
        // Version: 1.0
        // Parameter: dwFlag - The flag specifying if the input/output buffer
        // to be flushed
        // Return: HRESULT
        // Comment: This function is flushes the specfied buffer
        // Note: By default, both the input and output buffers are flushed
        //////////////////////////////////////////////////////////////////////

        HRESULT CSyncSerialComm::Flush(DWORD dwFlag)
        {
        if(PurgeComm(m_hSerialComm, dwFlag))
        return S_OK;
        else
        return E_FAIL;
        }


        .h

        // SyncSerialComm.h: interface for the CSyncSerialComm class.
        //
        //////////////////////////////////////////////////////////////////////
        #include <windows.h>

        #if !defined(AFX_SYNCSERIALCOMM_H__D1CAB621_DF4B_4729_ 82AB_31D5B9EFE8A9__INCLUDED_)
        #define AFX_SYNCSERIALCOMM_H__D1CAB621_DF4B_4729_82AB_31D5 B9EFE8A9__INCLUDED_

        #if _MSC_VER > 1000
        #pragma once
        #endif // _MSC_VER > 1000

        //////////////////////////////////////////////////////////////////////
        // Name: CSyncSerialComm
        // Version: 1.0
        // Comment: This class is responsible for provide I/O operation with
        // a serial port. It is implemented with Synchronous I/O viz. both
        // input and output operations block. Both read and write operations
        // are supported.
        //////////////////////////////////////////////////////////////////////

        class CSyncSerialComm
        {
        public:
        HRESULT Flush(DWORD dwFlag = PURGE_TXCLEAR | PURGE_RXCLEAR);
        HRESULT Write(const char *pszBuf, DWORD dwSize);
        HRESULT Read(char **ppszBuf, DWORD &dwSize);
        HRESULT ConfigPort(DWORD dwBaudRate = CBR_19200, DWORD dwTimeOutInSec = 5);
        HRESULT Close();
        HRESULT Open();

        CSyncSerialComm(const char *pszPortName);
        virtual ~CSyncSerialComm();

        private:
        char *m_pszPortName;
        HANDLE m_hSerialComm;
        };

        #endif // !defined(AFX_SYNCSERIALCOMM_H__D1CAB621_DF4B_4729_ 82AB_31D5B9EFE8A9__INCLUDED_)

        دیدگاه


          #19
          پاسخ : اینترفیس با ا¾c++یاVisual C++

          نوشته اصلی توسط محمد فخر

          سلام ، شرمنده که دیر شد
          گفته های آقای کرباسیان درست ولی تو این روش نیازی به نوشتن و خوندن از فایل نیست

          1 - mscomm32.ocx رو سیستم نصب کنید اگه فایلش رو دارید کپی کنید تو شاخه ی windows\system32
          2 - برید به start/run و cmd رو تایپ کنید و enter
          3 - دستور regsvr32 mscomm32.ocx را وارد کنید و enter
          4 - باید پیغامی معادل رجیستر با موفقیت انجام شد ببینید .
          5 - تو برنامه تون در قسمت toolbox یه جای خالی راست کلیک کنید و choos Item رو انتخاب کنید .
          6 - در قسمت Com Component گزینه ی Microsoft Communication Control رو تیک بزنید و OK کنید و خارج بشید .
          7 - این کنترل به toolbox اضافه می شه ، اون رو بگیرید و داخل دیالوگ برنامه بندازید .
          8 - تو Properties این کنترل می تونید شماره پورت ، سایز بافر ها و ... را تنظیم کنید
          9 - وقتی کنترل ساخته می شه یه object ازش درست می شه
          10 - این object دارای توابعی برای کار با پورت هست برای ارسال و دریافت اطلاعات می تونید ازشون استفاده کنید .
          11 - این کنترل دارای event دریافت و ارسال اطلاعات هست که می تونید از شون استفاده کنید
          12 - برای ارسال و دریافت باید از متغیرهای VARIANT استفاده کنید

          کد زیر یه مثال ساده برای ارسال دیتا است

          VARIANT var;
          CString str;

          com.put_PortOpen(true);

          str = "Hello Mohammad";
          var.vt = VT_BSTR;
          var.bstrVal = str.AllocSysString();

          while(com.get_CommEvent != 2);
          var = com.get_Input();
          MessageBox(var.bstrVal);
          com.put_PortOpen(false);
          میشه یه کم در مورد تنظیماتش و نحوه کار با اونبیشتر توضیح یدین.ممنون
          اگر انسان از همه خطر ها پرهیز کند ، هرگز راه به جائی نخواهد برد...

          دیدگاه


            #20
            پاسخ : اینترفیس با ا¾c++یاVisual C++

            سلام

            تنظیمات پیش فرض مناسبه ، برای تعریف com روی کنترل سریال راست کلیک کنید و Add Variable رو انتخاب کنید و تو پنجره ای که باز می شه com رو تعریف کنید .

            حضرت علی (ع) : خداوند از جاهلان پیمان فراگیرى علم نگرفته ، مگر آنکه قبلا از دنشمندان پیمان تعلیم دادن گرفته است .

            دیدگاه


              #21
              پاسخ : اینترفیس با ا¾c++یاVisual C++

              اگه میشه یه برنامه ساده بنویسید و source فایل ویژوال سی رو هم بزارین تا دقیقا بفهمم واسه ارسال و دریافت داده کجا چیو چه جوری استفاده کردین.
              اگر انسان از همه خطر ها پرهیز کند ، هرگز راه به جائی نخواهد برد...

              دیدگاه

              لطفا صبر کنید...
              X