Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c++] Передача данных через блютус, Сроки горят-сдавать послезавтра  
V
    Опции темы
agealex
Дата 11.9.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Если кому поможет буду только рад
В кратце - это dll
Многопоточное приложение:
 1 поток закрывает серийный порт
 2 поток пишет в очередь 
 3 поток отправляет в серийный порт
 4 поток читает  из серийного порта
Передача осуществляется через блютус(кпк - ноутбук)Должно работать и под линукс , но эта часть еще не дописана, так что выкладываю что есть. Возникает проблема при работе с серийным портом, при открытие их они автоматически закрываются через 3 секунды и это делает не специальный поток. 
Код

Driver.h

#if !defined __DIRVER_
#define __DRIVER_

#ifdef _WINDOWS

#ifdef DRIVER_EXPORTS
#define DRIVER_API __declspec(dllexport)
#endif

//return false - очередь пуста

extern "C" DRIVER_API bool __cdecl DrvMsgRecv(int MsgSize,UCHAR * QElement);
//return true  - элемент удален
extern "C" DRIVER_API bool __cdecl DrvMsgRecvDelete(UCHAR * QElement);
//return true  - сообщение отправлено. false-ошибка
extern "C" DRIVER_API bool __cdecl DrvMsgSend(UCHAR *buffer,int DataSize);

#endif _WINDOWS

#ifdef  _LINUX_

#endif _LINUX_
#endif


Код

Driver.cpp

// Driver.cpp : Defines the entry point for the DLL application.
//



#include "stdafx.h"
#include "Driver.h"

#ifdef  _WINDOWS

#include <queue>
#include <strsafe.h>
//#include <string>
//#include <stdio.h>
#include <windows.h>
#include "serial.h"//change 

#endif  _WINDOWS


#ifdef  _LINUX_
#include <string.h>
#include <sys/queue.h>

#include "serial.h"//change
#define UCHAR unsigned char
#endif  _LINUX_


#define MaxCount   5           //Сколько раз отправляется сообщение в случае неудачной отправки
#define CRC16_POLY 0x8408
#define Speed      9600        //Скорость порта

#define PortNumberRecv "COM6"  //Номер  порта приема    
#define PortNumberSend "COM9"  //Номер  порта отправки    
//Проверка достоверности посланного сигнала
#define SendFailed  0
#define SendSuccess 1            
#define Ping        2
//Ошибки
#define ErrSerialWrite      2 
#define ErrSerialRead       3 
#define ErrSerialOpen       4
#define ErrCrc              5
#define ErrMutexRecv        6
#define ErrMutexSend        7
#define ErrSending          8
#define ErrLock                9    
#define ErrUnLock           10
#define ErrThreadCreate     11
#define ErrConnectionFailed 12
#define ErrSerialClose      13
//открытие закрытие очередей
#ifdef _WINDOWS

#define LockQSend   WaitForSingleObject( hMutexSend, INFINITE );
#define UnLockQSend ReleaseMutex( hMutexSend )                 ;
#define LockQRecv   WaitForSingleObject( hMutexRecv, INFINITE );
#define UnLockQRecv ReleaseMutex( hMutexRecv )                 ;

HANDLE hPortSend          ;
HANDLE hPortRecv          ;
HANDLE hMutexSend         ;          
HANDLE hMutexRecv         ;          
HANDLE hThreadQSend       ;          
HANDLE hThreadSend        ;        
HANDLE hThreadRecv        ;        
HANDLE hThreadConExist    ;     
HANDLE hThreadSerialClose ; 

#endif _WINDOWS


#ifdef  _LINUX_

pthread_mutexattr_t  attr                                      ;//change add name
pthread_mutex_t      mutex                                     ;//change

#define LockQSend   pthread_mutex_lock(&mutex)                 ;//change
#define UnLockQSend pthread_mutex_unlock(&mutex)               ;//change
#define LockQRecv   pthread_mutex_lock(&mutex)                 ;//change
#define UnLockQRecv pthread_mutex_unlock(&mutex)               ;//change

#endif  _LINUX_
using namespace std            ;

static WORD  crc16tab[256]     ;
static DCB   backup_dcb        ;

queue<UCHAR> qSend             ;
queue<UCHAR> qRecv             ;
LPCTSTR FileNameSend = TEXT( PortNumberSend );
LPCTSTR FileNameRecv = TEXT( PortNumberRecv );
int   DrvBufSendSize           ;
int   DrvBufRecvSize = 300     ;
UCHAR *DrvBufferSend = NULL    ;
UCHAR *DrvBufferRecv = NULL    ;
//Если false то потоки работают
bool StopThreadSend     = false;
bool StopThreadRecv        = false;
bool StopThreadQSend    = false;
bool StopThreadSerial    = false;
bool StopThreadConExist = false;
//Флаги Выполнять если true
bool FSerialSendIsClosed= false; //Разрешить закрытие серийного порта отправки
bool FSerialRecvIsClosed= false; //Разрешить закрытие серийного порта приема
bool FSerialSendIsOpened= false; //Серийный порт отправки был открыт 
bool FSerialRecvIsOpened= false; //Серийный порт приема   был открыт
bool FQSendWrite        = false; 
bool FMsgRecv           = false;



//---------------------SERIAL-------------------------------------
//move from serial.h

//---------------------CRC----------------------------------------
void __cdecl CCRC()
{
    WORD i                          ;
    BYTE j                          ;
    WORD  crc16                     ;
    
    for (i=0; i<256; i++)
    {
        crc16 = i & 0xFF            ; 
        for (j=0; j<8; j++)
        {
            if (crc16 & 0x1) 
            {
                crc16 >>= 1         ;
                crc16 ^=  CRC16_POLY;
            }
            else crc16 >>= 1        ;
        }
        crc16tab[i]=crc16           ;
    }


}

WORD __cdecl calc16( BYTE *msg, WORD len )
{
    WORD CRC = 0xFFFF               ;
    while( len-- )
    {
        BYTE C = *msg++             ;
        CRC=((CRC >> 8) & 0x00ff) ^ crc16tab[(CRC ^ C) & 0x00ff];
    }
    return CRC ^ 0xFFFF             ;
}



//---------------------SERIALCLOSE--------------------------------
#ifdef  _WINDOWS
DWORD  __cdecl ThreadSerialClose( LPVOID lpParamSerialClose ) 
#endif _WINDOWS

#ifdef  _LINUX_

#endif  _LINUX_
{ 
    while( !StopThreadSerial )
    {
        Sleep (500);
        if( FSerialSendIsClosed == true && FSerialSendIsOpened == true)
        {
            int closeSend;
        
            closeSend = serial_close( hPortSend )  ;
            

            if( closeSend == 0 )
            {
                FSerialSendIsOpened = false;
                return 0               ;
            }
            else

            return ErrSerialClose      ;

        }
        if( FSerialRecvIsClosed == true && FSerialRecvIsOpened == true)
        {
            
            int closeRecv;
            
            closeRecv = serial_close( hPortRecv )  ;

            if( closeRecv == 0 )
            {
                FSerialRecvIsOpened = false;
                return 0                   ;
            }
            else

            return ErrSerialClose          ;
        }
    }
    return 0                               ;
}





Добавлено @ 20:16
Код

//---------------------RECIVE--------------------------------------
#ifdef  _WINDOWS
DWORD __cdecl ThreadRecv( LPVOID lpParamRecv ) 
#endif _WINDOWS

#ifdef  _LINUX_

#endif  _LINUX_
{ 
    while( !StopThreadSend )
    {
        
        WORD   DataRecvSize = 0                       ;  
        WORD   CrcRecv                                ;   //Пришедшее     crc
        WORD   CrcCheck                               ;   //Пересчитанное crc
        HANDLE SOpenRecv    = 0                       ;
        bool   QsendEmpty   = true                      ;
        if ( FSerialRecvIsClosed ||  !FSerialRecvIsOpened)
        {
            
            SOpenRecv = serial_open  ( FileNameRecv, Speed )      ;
            FSerialRecvIsClosed = false               ;
            FSerialRecvIsOpened = true                ;
        }
        if( SOpenRecv == 0)
        {
            return ErrSerialOpen                      ;
        }

        if ( DrvBufferRecv == NULL )
        {
            DrvBufferRecv = new UCHAR[DrvBufRecvSize]  ;
        }

        if( ( DataRecvSize = serial_read(hPortRecv,DrvBufferRecv,DrvBufRecvSize) ) > 1 )
        {
            CCRC()                                     ;
            
            CrcRecv =(WORD &)(*(DrvBufferSend +DataRecvSize - 2));
                        
            if( (CrcCheck = calc16((BYTE*)DrvBufferRecv,DataRecvSize - 2) ) == 0)
            {
                return ErrCrc                          ;
            }
            
            
            if( CrcCheck == CrcRecv )
            {
                LockQSend                              ;
                qSend.push( (const char &)SendSuccess );
                UnLockQSend                            ;
                LockQRecv                              ;
                qRecv.push((const int &)*DrvBufferRecv);
                UnLockQRecv                            ;
            }
        }//if( ( DataRecvSize = serial_read(hPort,DrvBufferRecv,DrvBufRecvSize) ) > 1 )
#ifdef _LINUX_
        else if( DrvBufferRecv[1] == Ping )
        {
            delete [] DrvBufferRecv                    ;
            LockQSend                                  ;
            qSend.push ( (const char &)Ping )          ;
            UnLockQSend                                ;
        }
#endif _LINUX_
        else if( DrvBufferRecv[1] == SendFailed )
        {
            delete [] DrvBufferRecv                    ;
            LockQSend                                  ;
            qSend.push ( (const char &)SendFailed )    ;
            UnLockQSend                                ;
        }
        QsendEmpty = qSend.empty()                     ;
        if( QsendEmpty )
         {
            FSerialSendIsClosed = true                 ;
         }
        Sleep(50)                                      ;
     }//while( !StopThreadSend ) 
     return 0                                          ;
}//ThreadRecv
DRIVER_API bool __cdecl DrvMsgRecv(int MsgSize,UCHAR * QElement)
{
    bool QRecvEmpty = true         ;
    QRecvEmpty = qRecv.empty()     ;
    if(!QRecvEmpty)
    {
        LockQRecv                  ;
        
        QElement =(UCHAR *) (qRecv.front()) ;        
        UnLockQRecv                ;
        MsgSize = sizeof(&QElement);
        if(MsgSize != 0)
        {
            return 1               ;
        }
        return 0                   ;
    }
    return 0;
}
DRIVER_API bool  __cdecl DrvMsgRecvDelete(UCHAR * QElement)
{
    qRecv.pop()                   ;
    delete []QElement             ;
    if(sizeof(QElement) == 0 )
    {
        return 1                  ;
    }
    else return 0                 ;
}
//---------------------SEND----------------------------------------
#ifdef  _WINDOWS
DWORD __cdecl ThreadQSend( LPVOID lpParamSend ) 
#endif _WINDOWS

#ifdef  _LINUX_
//Сделать вызов
#endif  _LINUX_
{
    while( !StopThreadQSend )
    {
        if( FQSendWrite )
        {
            LockQSend                                  ;
            qSend.push( (const char &)*DrvBufferSend ) ;
            UnLockQSend                                ;
            FQSendWrite = false                        ;
            return 1                                   ;
        }
        return 0                                       ;
    }
    return 0                                           ;
}
#ifdef  _WINDOWS
DWORD  __cdecl ThreadSend( LPVOID lpParamSend ) 
#endif _WINDOWS

#ifdef  _LINUX_

#endif  _LINUX_
{ 
    while( !StopThreadSend )
    {
        Sleep(100)                                     ;
        int    counter      = 0                        ; //Сколько раз отправили сообщение
        HANDLE SSendOpen    = 0                           ;
        int    SSendWrite   = 0                        ;
        bool   QSendEmpty   = (qSend.empty())          ;

        if( !QSendEmpty )
        {
            if ( FSerialSendIsClosed ||  !FSerialSendIsOpened)
            {
                
                SSendOpen = serial_open  ( FileNameSend, Speed )   ;
                
                FSerialSendIsClosed = false            ;
                FSerialSendIsOpened = true             ;
            } 
            if( SSendOpen == 0 )
            {
                return ErrSerialOpen                   ;
            }

            LockQSend                                  ;
            UCHAR  DrvMsg = ( qSend.front() )          ;
            UnLockQSend                                ;
            int  DrvMsgSize = sizeof( &DrvMsg )        ;
 
            if( DrvMsg == SendSuccess ||DrvMsg == SendFailed )
            {
                SSendWrite = serial_write( hPortSend,(void *)&DrvMsg, DrvMsgSize );
                if( SSendWrite == 0 )
                {
                    return ErrSerialWrite              ;
                }
                LockQSend                              ;
                qSend.pop()                            ;
                delete [] DrvBufferSend                ;
                UnLockQSend                            ;

            }
            else
            
            while( DrvBufferRecv[1] != SendSuccess  ||DrvBufferRecv[1] != Ping || counter< MaxCount )
            {
                counter++                              ;
                SSendWrite = serial_write( hPortSend,(void *)DrvMsg, DrvMsgSize );
                if( SSendWrite == 0 )
                { 
                    return ErrSerialWrite              ; 
                }
                
                Sleep(100)                             ;
            }
        }//if(!qSend.empty())
        if( counter == 5 ) 
        {
            LockQRecv                                  ;
            qRecv.push( ErrConnectionFailed )          ;
            UnLockQRecv                                ;
            ExitProcess( ErrSending )                  ;
        }
        else if( DrvBufferRecv[1] == SendSuccess || DrvBufferRecv[1] == Ping )
        {
            LockQSend                                  ;
            qSend.pop()                                ;
            UnLockQSend                                ;
            delete [] DrvBufferSend                    ;
        }
        
        
    }//while( !StopThreadSend )
        return 0                                       ;




Это сообщение отредактировал(а) agealex - 12.9.2007, 23:59
PM MAIL   Вверх
agealex
Дата 11.9.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Код

}//ThreadSend




DRIVER_API bool __cdecl DrvMsgSend( UCHAR * buffer,int  DataSize )
{
    hMutexRecv = CreateMutex(NULL, FALSE, NULL);
    if ( hMutexRecv == NULL )    
    {
        ExitProcess( ErrMutexRecv )   ;
    } 
    
            
    hMutexSend = CreateMutex(NULL, FALSE, NULL);
    if ( hMutexSend == NULL )
    {
        ExitProcess( ErrMutexSend )   ;
    }
    hThreadSerialClose = CreateThread( 
            NULL,              // default security attributes
            0,                 // use default stack size  
            ThreadSerialClose, // thread function 
            0,                 // argument to thread function 
            0,                 // use default creation flags 
            0);                // returns the thread identifier 
    if ( hThreadSerialClose == NULL )
    {
        ExitProcess( ErrThreadCreate );
    }

    hThreadQSend = CreateThread( 
            NULL,              // default security attributes
            0,                 // use default stack size  
            ThreadQSend,       // thread function 
            0,                 // argument to thread function 
            0,                 // use default creation flags 
            0);                // returns the thread identifier 
    if ( hThreadQSend == NULL )
    {
        ExitProcess( ErrThreadCreate );
    } 
  
    hThreadRecv = CreateThread( 
            NULL,              // default security attributes
            0,                 // use default stack size  
            ThreadRecv,        // thread function 
            DrvBufferSend,     // argument to thread function 
            0,                 // use default creation flags 
            0);                // returns the thread identifier 
    if ( hThreadRecv == NULL )
    {
        ExitProcess( ErrThreadCreate ); 
    }

    hThreadSend = CreateThread( 
            NULL,              // default security attributes
            0,                 // use default stack size  
            ThreadSend,        // thread function 
            0,                 // argument to thread function 
            0,                 // use default creation flags 
            0);                // returns the thread identifier 
    if ( hThreadSend == NULL )
    {
        ExitProcess( ErrThreadCreate );
    }

    
    
    
    
    



Добавлено через 48 секунд
Код



    DrvBufSendSize = DataSize+2                        ;   //Размер массива в драйвере
    WORD rc                                            ;   //CRC
    CCRC()                                             ;
    if((rc = calc16( (BYTE*) &buffer,(WORD)DataSize))== 0 )
    { 
        return 0                                       ;
    }
    if ( DrvBufferSend == NULL )
    {
     DrvBufferSend = new UCHAR[DrvBufSendSize]         ;
    }
    memcpy( &DrvBufferSend[0],&buffer[0],DataSize )    ;
 //  (WORD &)( *(DrvBufferSend +DataSize) ) = rc       ;   //Добавление crc в буфер
//#ifdef _WINDOWS
    FQSendWrite = true                                 ;
//#endif _WINDOWS
                                     //Флаг-записать в очередь
    delete [] buffer                                   ;
    return true                                        ;

}//DrvMsgSend


//---------------------PING----------------------------------------
#ifdef _WINDOWS
DWORD __cdecl ThreadConExist( LPVOID lpParamConExist )

{
    while( !StopThreadConExist )
    {
        if( qSend.empty() && qRecv.empty() && FSerialSendIsClosed && FSerialRecvIsClosed )
        {
            qSend.push ( (const char &)Ping )          ;
            Sleep(3000)                                ;    
            
        }
        
    }
    return 0                                           ;
}


#endif _WINDOWS


Добавлено через 1 минуту и 51 секунду
Код



serial.cpp

#include "stdafx.h"
//#include <vcl.h>

#include "serial.h"

#define my_printf
#define min(a, b)  (((a) < (b)) ? (a) : (b))

static DCB backup_dcb;

/* Close the serial port and restore old settings. */
int serial_close(HANDLE hPort)
{
    /* disable event notification and wait for thread to halt */
    SetCommMask(hPort, 0);

    /* purge any outstanding reads/writes and close device handle */
    PurgeComm(hPort, PURGE_TXABORT | PURGE_RXABORT |
                 PURGE_TXCLEAR | PURGE_RXCLEAR);

    /* drop DTR */
    EscapeCommFunction(hPort, CLRDTR);

    if (SetCommState(hPort, &backup_dcb)==0)
        my_printf("SetCommState in serial_close");

    if( CloseHandle(hPort)==0 )
        my_printf("CloseHandle in serial_close");

    return 0;
}

HANDLE serial_open(LPCTSTR FileName, int Speed)
{
    HANDLE hPort;
    DCB    dcb;

    hPort = CreateFile(FileName,
                GENERIC_READ | GENERIC_WRITE,
                0,                    /* exclusive access */
                NULL,                 /* no security attrs */
                OPEN_EXISTING,
                0, /* overlapped I/O */
                NULL);

    if (hPort == INVALID_HANDLE_VALUE)
    {
        my_printf("CreateFile in serial_open");
        return NULL;
    }

    backup_dcb.DCBlength = sizeof(DCB);
    if( GetCommState(hPort, &backup_dcb)==0 )
    {
        my_printf("ReadDevice in serial_open");
        return NULL;
    }

    SetCommMask(hPort, EV_RXCHAR);

    /* try to setup device buffers */
    if( SetupComm(hPort, 4096, 4096) == 0 ) // my settings
        my_printf("Setup device buffers failed. See GetLastError()\n");

    /* purge any information in the buffer */
    PurgeComm(hPort, PURGE_TXABORT | PURGE_RXABORT |
                 PURGE_TXCLEAR | PURGE_RXCLEAR);

    /* Initialise the port settings */
    memcpy(&dcb, &backup_dcb, sizeof(DCB));

    dcb.ByteSize = 8;
    dcb.Parity   = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.BaudRate = Speed;

    /* No Xon/Xof flow control */
    if (SetCommState(hPort, &dcb)==0)
    {
        my_printf("WriteDevice in serial_open");
        return NULL;
    }

    return hPort;
}

int serial_setparity(HANDLE hPort, bool parity)
{
    DCB            dcb;

    dcb.DCBlength = sizeof(DCB);
    if( GetCommState(hPort, &dcb)==0 )
    {
        my_printf("ReadDevice in serial_setparity");
        return 1;
    }

    if (parity) dcb.Parity = ODDPARITY;
           else dcb.Parity = NOPARITY;

    if( SetCommState(hPort, &dcb)==0 )
    {
        my_printf("WriteDevice in serial_setparity");
        return 2;
    }

    return 0;
}



Добавлено через 2 минуты и 39 секунд
Код



/* Set the DTR and RTS bit of the serial device. */
int serial_setdtrrts(HANDLE hPort, bool dtr, bool rts)
{
    DCB             dcb;

    dcb.DCBlength = sizeof(DCB);
    if (GetCommState(hPort, &dcb)==0) {
        my_printf("ReadDevice in serial_setdtrrts");
        return 1;
    }

    dcb.fOutxDsrFlow = 0;
    if (dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE;
        else dcb.fDtrControl = DTR_CONTROL_DISABLE;

    dcb.fOutxCtsFlow = 0;
    if (rts) dcb.fRtsControl = RTS_CONTROL_ENABLE;
        else dcb.fRtsControl = RTS_CONTROL_DISABLE;

    /* no software (Xon/Xof) flow control */
    dcb.fInX = dcb.fOutX = 0;

    if (SetCommState(hPort, &dcb)==0) {
        my_printf("WriteDevice in serial_setdtrrts");
        return 2;
    }

    dcb.DCBlength = sizeof(DCB);
    GetCommState(hPort, &dcb);

    my_printf("Serial device:");
    my_printf(" DTR is ");
    switch (dcb.fDtrControl) {
        case DTR_CONTROL_ENABLE    : my_printf("up");        break;
        case DTR_CONTROL_DISABLE   : my_printf("down");      break;
        case DTR_CONTROL_HANDSHAKE : my_printf("handshake"); break;
    }
    my_printf(", RTS is ");
    switch (dcb.fRtsControl) {
        case RTS_CONTROL_ENABLE    : my_printf("up");        break;
        case RTS_CONTROL_DISABLE   : my_printf("down");      break;
        case RTS_CONTROL_HANDSHAKE : my_printf("handshake"); break;
        case RTS_CONTROL_TOGGLE    : my_printf("toggle");    break;
    }
    my_printf("\n");
    if ( dtr && dcb.fDtrControl != DTR_CONTROL_ENABLE ) return 3;
    if (!dtr && dcb.fDtrControl != DTR_CONTROL_DISABLE) return 4;
    if ( rts && dcb.fRtsControl != RTS_CONTROL_ENABLE ) return 5;
    if (!rts && dcb.fRtsControl != RTS_CONTROL_DISABLE) return 6;

    return 0;
}

/* Change the speed of the serial device.
 * RETURNS: Success
 */
int serial_setspeed(HANDLE hPort, int speed)
{
    DCB            dcb;

    dcb.DCBlength = sizeof(DCB);
    if (GetCommState(hPort, &dcb)==0) {
        my_printf("Failed GetCommState in serial_setspeed");
        return 1;
    }

    dcb.BaudRate = speed;

    if (SetCommState(hPort, &dcb)==0) {
        my_printf("Failed SetCommState in serial_setspeed");
        return 2;
    }

    return 0;
}

/* Read from serial device. */
int serial_read(HANDLE hPort, void *buf, int nbytes)
{
    bool            fReadStat;
    COMSTAT            ComStat;
    DWORD            dwErrorFlags;
    DWORD            dwLength=0;
    DWORD           dwReturn = 0;

    /* only try to read number of bytes in queue */
    if( ClearCommError(hPort, &dwErrorFlags, &ComStat) == 0 )
        my_printf("Error %d wait comm event.\n", GetLastError());

    dwLength = min((DWORD) nbytes, ComStat.cbInQue);
    if (dwLength > 0) {
        fReadStat = ReadFile(hPort, buf, dwLength, &dwReturn, NULL);
        if (!fReadStat)
            my_printf("Read from COM failed\n");
    }

#if FULL_SERIAL_DUMP
    if( dwLength > 0 )
    {
        DWORD i;
        char St[100] = "";

        my_printf("Received %d bytes from COM:", dwLength);
        for(i=0; i<dwLength; i++)
        {
            char sDig[10];

            if( (i & 0xF) == 0 )
            {
                my_printf("%s\n", St);
                St[0] = 0;
            }
            sprintf(sDig, "%02x ", ((BYTE*)buf)[i]);
            strcat(St, sDig);
        }
        my_printf("%s\n", St);
    }
#endif

    return (dwReturn);
}

/* Write to serial device. */
int serial_write(HANDLE hPort, void *buf, int nbytes)
{
    bool            fWriteStat;
    DWORD            dwBytesSent = 0;

    fWriteStat = WriteFile(hPort, buf, nbytes, &dwBytesSent, NULL);

    /* Note that normally the code will not execute the following
     * because the driver caches write operations. Small I/O requests
     * (up to several thousand bytes) will normally be accepted
     * immediately and WriteFile will return true even though an
     * overlapped operation was specified
     */
    if (!fWriteStat)
        my_printf("Write to COM failed\n");

#if FULL_SERIAL_DUMP
    if( dwBytesSent > 1 )
    {
        DWORD i;
        char St[100] = "";

        my_printf("Sent to COM %d bytes:", dwBytesSent);
        for(i=0; i<dwBytesSent; i++)
        {
            char sDig[10];

            if( (i & 0xF) == 0 )
            {
                my_printf("%s\n", St);
                St[0] = 0;
            }
            sprintf(sDig, "%02x ", ((BYTE*)buf)[i]);
            strcat(St, sDig);
        }
        my_printf("%s\n", St);
    }
#endif
    return dwBytesSent;
}

 



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.