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

📄 main.cpp

📁 一个串口通讯的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//串口句柄
namespace {
    const AnsiString szSeparator=",";
    HANDLE hCom;
    unsigned int iCom;
    unsigned int iSeconds;
    unsigned int iRetCode;
    DWORD dwErrorMask;
    COMSTAT comst;
}
//-------------------------------------------------------------------------------
//初始化串口
int Init232(unsigned int  *ipCom,unsigned int BufferSize)
{

        char szCom[5];
        
        
        memset(szCom,0,5);
        //打开串口
        switch(*ipCom)
        {
            case 1:
            memcpy(szCom,"COM1",4);
            break;
            case 2:
            memcpy(szCom,"COM2",4);
            break;
            case 3:
            memcpy(szCom,"COM3",4);
            break;
            case 4:
            memcpy(szCom,"COM4",4);
            break;

        }
        hCom=CreateFile(szCom,
                        GENERIC_READ | GENERIC_WRITE,
                        0,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        //FILE_FLAG_OVERLAPPED,
                        NULL
                        );
        if(hCom==INVALID_HANDLE_VALUE)
        {
               GetLastError();
               return -1;
        }
        SetupComm(hCom,BufferSize,BufferSize);
        //参数设置
        DCB dcb;
        GetCommState(hCom,&dcb);
        //波特率 115200
        dcb.BaudRate=115200;
        //数据位:8
        dcb.ByteSize=8;
        //停止位 1
        dcb.StopBits=ONESTOPBIT;
        dcb.Parity=NOPARITY;

        SetCommState(hCom,&dcb);
        COMMTIMEOUTS comtimes;
        
        GetCommTimeouts(hCom,&comtimes);
        comtimes.ReadTotalTimeoutMultiplier=100;
        comtimes.ReadTotalTimeoutConstant=100;
        SetCommTimeouts(hCom,&comtimes);

        return 0;
}
//-------------------------------------------------------------------------
int Close232()
{
    if(CloseHandle(hCom)==true)
        return 0;
    else
        return -1;
}
//------------------------------------------------------------------------------
int SetTimeOut(DWORD overTimes)
{
        COMMTIMEOUTS	timout;
	timout.ReadIntervalTimeout=0;
	timout.ReadTotalTimeoutConstant=overTimes;	// 毫秒
	timout.ReadTotalTimeoutMultiplier=0;
	timout.WriteTotalTimeoutConstant=0;
	timout.WriteTotalTimeoutMultiplier=0;

	if(!SetCommTimeouts(hCom,&timout))
	{// 设置timeout机制失败!
		return -10;
	}
        return 0;
}


//******************************************************************************
//建立Flash 下载连接命令(20H+30H)
//******************************************************************************
unsigned int  DTM_FlashDown_Connect(unsigned int *ipCom,unsigned int *ipTimes,unsigned char *parm)
{
         //设置命令
        unsigned char szSendCmd[9];
        //返回数据包头缓冲;
        unsigned char szRecHeadBuf[4];
        //数据包头
        unsigned char szHead[4];
        //校验和中间变量
        unsigned char szSum;
        //接收到的数据长度缓冲
        unsigned char szRecLengthBuf[3];
        //数据缓冲空间指针
        unsigned char *szDataBuf;

        DWORD dwByteWrite;
        DWORD dwByteRead;
        //计算接收数据长度变量
        unsigned int iLenF,iLenS,iDataLen,iRetCode;
        //读取参数
        iSeconds=*ipTimes;
        //打开串口
        iRetCode=Init232(ipCom);
        if(iRetCode!=0)
            return C_OPEN_COM_ERR;
        //填充数据包头部
        memset(szHead,0,4);
        szHead[0]=0x1a;
        szHead[1]=0x72;
        szHead[2]=0x73;
        //填充数据包
        memset(szRecHeadBuf,0,4);
        memset(szSendCmd,0,9);
        memcpy(szSendCmd,szHead,3);
        szSendCmd[3]=0x00;
        szSendCmd[4]=0x03;
        szSendCmd[5]=0x20;
        szSendCmd[6]=0x30;
        szSum=char(0x00);
        //校验数据
        for(int i=0;i<7;i++)
                szSum+=szSendCmd[i];
        //填入校验和数据
        szSendCmd[7]=szSum;
        //清除输出缓冲
        PurgeComm(hCom,PURGE_TXCLEAR);
        //清除输入缓冲
        PurgeComm(hCom,PURGE_RXCLEAR);
        dwByteWrite=8;
        //发送数据
        //ClearCommBreak(hCom);
        if(WriteFile(hCom,szSendCmd,8,&dwByteWrite,NULL)==false)
        {
                ClearCommError(hCom,&dwErrorMask,&comst);
                Close232();
                return   C_WRITE_COM_ERR;
        }
        //延时
        if(SetTimeOut(iSeconds)!=0)
        {
            Close232();
            return C_SETTIMES_ERR; //设置超时出错
        }
        //接收数据

        dwByteRead=0;
        memset(szRecHeadBuf,0,4);
        Sleep(500);
        //接收数包头
        ReadFile(hCom,szRecHeadBuf,3,&dwByteRead,NULL);
        if(dwByteRead!=3)
        {
                Close232();
                return C_DATA_LEN_ERR;
        }
        if(memcmp(szRecHeadBuf,szHead,3)!=0)
        {
                Close232();
                return C_DATA_HEAD_ERR;
        }

        //接收数据长度值
        dwByteRead=0;
        memset(szRecLengthBuf,0,3);
        ReadFile(hCom,szRecLengthBuf,2,&dwByteRead,NULL);
        if(dwByteRead!=2)
        {
                Close232();
                return C_DATA_LEN_ERR;
        }

        iLenF=szRecLengthBuf[0];
        iLenS=szRecLengthBuf[1];
        iDataLen=iLenF*256+iLenS;
        //ShowMessage(iDataLen);
        dwByteRead=0;
        szDataBuf=new unsigned char[iDataLen+1];
        memset(szDataBuf,0,iDataLen+1);
        ReadFile(hCom,szDataBuf,iDataLen,&dwByteRead,NULL);
        //接收数据数量不对
        if(dwByteRead!=iDataLen)
        {
                Close232();
                delete[] szDataBuf;
                return C_DATA_LEN_ERR;
        }

        szSum=0x1A+0x72+0x73;
        szSum+=szRecLengthBuf[0];
        szSum+=szRecLengthBuf[1];
        for(unsigned int i=0;i<iDataLen-1;i++)
        {
                szSum+=szDataBuf[i];
        }

        //校验和出错
        if(szSum!=szDataBuf[iDataLen-1])
        {
                Close232();
                delete[] szDataBuf;
                return C_CRCERR;
        }
        //检查返回命令字
        if((szDataBuf[0]!=0x20) || (szDataBuf[1]!=0x30))
        {
                Close232();
                delete[] szDataBuf;
                return C_DATA_HEAD_ERR;

        }
        //检查返回值
        if(szDataBuf[3]!=0x00)
        {
                iRetCode=szDataBuf[3];

                Close232();
                delete[] szDataBuf;
                return iRetCode;
        }
        //如果连接成功
        else
        {

                delete[] szDataBuf;
                Close232();
                return 0;
        }
}

                                                                          
//******************************************************************************
//写FLASH命令(20H+31H)                                                          
//******************************************************************************
unsigned int DTM_FlashDown_Write(unsigned int *ipCom,unsigned int *ipTimes,unsigned char *parm)
{
         //设置命令
        unsigned char szSendCmd[11];
        //返回数据包头缓冲;
        unsigned char szRecHeadBuf[4];
        //数据包头
        unsigned char szHead[4];
        //校验和中间变量
        unsigned char szSum;
        //接收到的数据长度缓冲
        unsigned char szRecLengthBuf[3];
        //数据缓冲空间指针
        unsigned char *szDataBuf;


        DWORD dwByteWrite;
        DWORD dwByteRead;
        //计算接收数据长度变量
        unsigned int iLenF,iLenS,iDataLen,iRetCode;
        //读取参数
        iSeconds=*ipTimes;
        //打开串口
        iRetCode=Init232(ipCom);
        if(iRetCode!=0)
            return C_OPEN_COM_ERR;
        //填充数据包头部
        memset(szHead,0,4);
        szHead[0]=0x1a;
        szHead[1]=0x72;
        szHead[2]=0x73;
        //填充数据包
        memset(szRecHeadBuf,0,4);
        memset(szSendCmd,0,10);
        memcpy(szSendCmd,szHead,3);
        szSendCmd[3]=0x00;
        szSendCmd[4]=0x03;
        szSendCmd[5]=0x20;
        szSendCmd[6]=0x36;
        szSum=char(0x00);
        //校验数据
        for(int i=0;i<7;i++)
                szSum+=szSendCmd[i];
        //填入校验和数据
        szSendCmd[7]=szSum;
        //清除输出缓冲
        PurgeComm(hCom,PURGE_TXCLEAR);
        //清除输入缓冲
        PurgeComm(hCom,PURGE_RXCLEAR);
        dwByteWrite=10;
        //发送数据
        Sleep(1000);
        if(WriteFile(hCom,szSendCmd,8,&dwByteWrite,NULL)==false)
        {
                ClearCommError(hCom,&dwErrorMask,&comst);
                Close232();
                return   C_WRITE_COM_ERR;
        }
        //延时
        if(SetTimeOut(iSeconds)!=0)
        {
            Close232();
            return C_SETTIMES_ERR; //设置超时出错
        }
        //接收数据

        dwByteRead=0;
        memset(szRecHeadBuf,0,4);
        Sleep(1000);
        //接收数包头
        ReadFile(hCom,szRecHeadBuf,3,&dwByteRead,NULL);
        if(dwByteRead!=3)
        {
                Close232();
                return C_DATA_LEN_ERR;
        }
        if(memcmp(szRecHeadBuf,szHead,3)!=0)
        {
                Close232();
                return C_DATA_HEAD_ERR;
        }

        //接收数据长度值
        dwByteRead=0;
        memset(szRecLengthBuf,0,3);
        ReadFile(hCom,szRecLengthBuf,2,&dwByteRead,NULL);
        if(dwByteRead!=2)
        {
                Close232();
                return C_DATA_LEN_ERR;
        }

        iLenF=szRecLengthBuf[0];
        iLenS=szRecLengthBuf[1];
        iDataLen=iLenF*256+iLenS;
        //ShowMessage(iDataLen);
        dwByteRead=0;
        szDataBuf=new unsigned char[iDataLen+1];
        memset(szDataBuf,0,iDataLen+1);
        ReadFile(hCom,szDataBuf,iDataLen,&dwByteRead,NULL);
        //接收数据数量不对
        if(dwByteRead!=iDataLen)
        {
                Close232();
                delete[] szDataBuf;
                return C_DATA_LEN_ERR;
        }

        szSum=0x1A+0x72+0x73;
        szSum+=szRecLengthBuf[0];
        szSum+=szRecLengthBuf[1];
        for(unsigned int i=0;i<iDataLen-1;i++)
        {
                szSum+=szDataBuf[i];
        }

        //校验和出错
        if(szSum!=szDataBuf[iDataLen-1])
        {
                Close232();
                delete[] szDataBuf;
                return C_CRCERR;
        }
        //检查返回命令字
        if((szDataBuf[0]!=0x20) || (szDataBuf[1]!=0x36))
        {
                Close232();
                delete[] szDataBuf;
                return C_DATA_HEAD_ERR;

        }
        //检查返回值
        if(szDataBuf[3]!=0x00)
        {
                iRetCode=szDataBuf[3];

                Close232();
                delete[] szDataBuf;
                return iRetCode;
        }
        //如果连接成功
        else
        {

                delete[] szDataBuf;
                Close232();
                return 0;
        }
}

                                                                            
//******************************************************************************
//Flash 数据报传输命令(20H+31H)                                                 
//******************************************************************************
unsigned int  DTM_FlashDown_Transfer(unsigned int *ipCom,unsigned int *ipTimes,unsigned int iCmdNo,unsigned int iFileLen,unsigned int *PackNo,unsigned int PackLen,unsigned char *parm)
{
        //命令字
        unsigned char * szSendCmd;
        //返回数据包头缓冲;
        unsigned char szRecHeadBuf[4];
        //数据包头
        unsigned char szHead[4];
        //校验和中间变量
        unsigned char szSum;
        //接收到的数据长度缓冲
        unsigned char szRecLengthBuf[3];
        //数据缓冲空间指针
        unsigned char *szDataBuf;
        unsigned int iPackNo,iPackLen,iLenF,iLenS,iDataLen;
        AnsiString szRetStr;

        DWORD dwByteWrite;
        DWORD dwByteRead;
        unsigned int iRetCode;

        //计算接收数据长度变量
        unsigned int iLen;

        //截取参数
        iSeconds=*ipTimes;
        szRetStr=AnsiString((char *)parm);

        //报文头
        memset(szHead,0,4);
        szHead[0]=0x1a;
        szHead[1]=0x72;
        szHead[2]=0x73;
        iPackNo=(*PackNo);

⌨️ 快捷键说明

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