📄 main.cpp
字号:
//---------------------------------------------------------------------------
#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 + -