⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_cdtcpp.~cpp

📁 通讯软件 Rs232 数据采集 Sql2000数据库
💻 ~CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MAIN_CDTcpp.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMain *Main;

/*struct YX{
    DWORD TBZ[3];
    unsigned char KZZ[6];
    unsigned char XXZ[4][6];
};

struct YC{
    DWORD TBZ[3];
    unsigned char KZZ[6];
    unsigned char XXZ[38][6];
};*/

//---------------------------------------------------------------------------
__fastcall TMain::TMain(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TMain::FormCreate(TObject *Sender)
{
    hComm = INVALID_HANDLE_VALUE;
    Timer1->Enabled=false;

    BufferLenght=100;

    hComm = CreateFile("COM1", GENERIC_READ, 0, 0,
                             OPEN_EXISTING, 0, NULL);
    if( INVALID_HANDLE_VALUE == hComm  ){
        ShowMessage("无法打开串口1");
        //Close();
    }

    DCB dcb;

    dcb.DCBlength=sizeof(DCB);
    if( !GetCommState(hComm, &dcb) ){
        CloseHandle(hComm);
        ShowMessage("无法获取串口1设置");
        //Close();
    }

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

    if( !SetCommState(hComm,&dcb) ){
        CloseHandle(hComm);
        ShowMessage("无法设置串口1");
        //Close();
    }

    SetupComm(hComm, 1024, 0);
    
    COMMTIMEOUTS t;
    t.ReadIntervalTimeout = MAXDWORD;
    t.ReadTotalTimeoutMultiplier = 5000;
    t.ReadTotalTimeoutConstant = 500;
    t.WriteTotalTimeoutMultiplier = 5000;
    t.WriteTotalTimeoutConstant = 500;

    if( !SetCommTimeouts(hComm, &t) ){
        CloseHandle(hComm);
        ShowMessage("串口1设置错误");
        //Close();
    }

    PurgeComm(hComm, PURGE_TXCLEAR);
    PurgeComm(hComm, PURGE_RXCLEAR);

    Timer1->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TMain::FormClose(TObject *Sender, TCloseAction &Action)
{
    if(hComm)
        CloseHandle(hComm);
    
    /*if(MSComm1->PortOpen==true)
        MSComm1->PortOpen=false;*/
}

void __fastcall TMain::Timer1Timer(TObject *Sender)
{
    OVERLAPPED sa;
    unsigned long error;
    Timer1->Enabled=false;

    sa.Offset=0;
    sa.OffsetHigh=0;
    sa.hEvent = NULL;

    if( INVALID_HANDLE_VALUE != hComm ){
        //从串口读数据
        ClearCommError(hComm, &error, NULL);
        ReadFile(hComm, uchCommBuffer, 500, &BufferLenght, &sa);

        Label4->Caption = AnsiString(BufferLenght);

        if( BufferLenght>30 ) {
            ShowMemoData();
            GetCDTData();
        }
    }

    Timer1->Enabled=true;
}
//---------------------------------------------------------------------------


void TMain::GetCDTData(void)
{
    DWORD start=0;

    //查找帧开始位置
    for( DWORD i=0; i<BufferLenght-6; i++ ){
        if( ( 0xEB == uchCommBuffer[i] ) & (0x90 == uchCommBuffer[i+1] )&&
            (0xEB == uchCommBuffer[i+2]) & (0x90 == uchCommBuffer[i+3])&&
            (0xEB == uchCommBuffer[i+4]) & (0x90 == uchCommBuffer[i+5]) ){
            start=i;
            break;
        }
    }

    //ShowMessage(start);

    if( start!=0 ){
        if( uchCommBuffer[start+6] < 128 ){//如果控制字第7bit为0(有信息字)
            switch( uchCommBuffer[start+7] ){//根据帧类别处理
                case 0x61:
                    GetYC(start);
                break;
                case 0xC2:
                break;
                case 0xB3:
                break;
                case 0xF4:
                    GetYX(start);
                break;
                case 0x85:
                break;
                case 0x26:
                break;
                case 0x57:
                break;
                case 0xA8:
                break;
                case 0xD9:
                break;
                case 0x7A:
                break;
                case 0x0B:
                break;
                case 0x4C:
                break;
                case 0x3D:
                break;
                case 0x9E:
                break;
                default:
                break;
            }
        }
    }
}

void TMain::GetYC(int i)
{
    unsigned char *p=&uchCommBuffer[i+12];

    if( BufferLenght-12 < 24 )
        return;

    Memo1->Lines->Add("1234");

    for( int i=0; i<4; i++)
        for( int j=0; j<6; j++ )
            StringGrid2->Cells[i][j]=*(p+i*6+j);
}

void TMain::GetYX(int i)
{
    unsigned char *p=&uchCommBuffer[i+12];

    if( BufferLenght-12 < 24 )
        return;

}
//---------------------------------------------------------------------------


/*void __fastcall TMain::MSComm1Comm(TObject *Sender)
{
    //ShowMessage("abcdefg");
    AnsiString str; //声明一个AnsiString类型的变量
    OleVariant s; //声明一个用于接收数据的OleVariant变量。
    if(MSComm1->CommEvent==comEvReceive){// 接收缓冲区中是否收到Rthreshold个字符。
        if(MSComm1->InBufferCount){// 是否有字符驻留在接收缓冲区等待被取出
            s=MSComm1->Input;//接收数据

            str=" ";
            str+=s.AsType(varString);
            Memo1->Text+=str;
        }
    }

}*/
//---------------------------------------------------------------------------


void TMain::ShowMemoData()
{
    for(DWORD i=0; i<BufferLenght; i+=6){
        Memo1->Lines->Add(IntToHex(uchCommBuffer[i], 2)+" "+
                            IntToHex(uchCommBuffer[i+1], 2)+" "+
                            IntToHex(uchCommBuffer[i+2], 2)+" "+
                            IntToHex(uchCommBuffer[i+3], 2)+" "+
                            IntToHex(uchCommBuffer[i+4], 2)+" "+
                            IntToHex(uchCommBuffer[i+5], 2)+" ");
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -