📄 filesenddlg.cpp
字号:
// filesendDlg.cpp : implementation file
//
#include "stdafx.h"
#include "filesend.h"
#include "filesendDlg.h"
#include "bst_api.h"
#include "UclDlg.h"
#define MAX_FILE_NUM 32
#define L 175 //出去头文件头信息 剩余175字节
#define cardnumber 0 //发送卡卡号
#define frame 188 //定义小包格式为188
#define senddatalength 24064 //188*32*4 定义一次要发送24064字节的包
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
char buffer[188]={""}; //存取文件内容和头内容
char pbuffer[senddatalength]={""}; //大包
int ts_sendpacket=0; //定义发送了好多包;
int ts_packettotal=0; //初始化总包数为0;
UINT position=0; //定义一个变量来与大包24064之间的比较 循环封装大包
int i=0; //定义这个变量用来在循环发送中检测文件是否不够用到
BOOL stop=FALSE;
long int yijingfasong=0;
//////////////////////////////////////////////////////////////////////
BYTE ts_top=0x47; // 定义同步字节为0X47
BYTE ts_hiPID=0x00; //PID号前面的四位为0;
BYTE ts_PID=0x55; //PID号 为0X55
BYTE ts_count[MAX_FILE_NUM]; //计数器的初始值为0到16
//BYTE count=0x10;
FILE *m_pSourceFile;
int file_num=0; //在程序中将获取文件的个数
float rate; //定义发送卡的速率
CString filename[MAX_FILE_NUM];
BYTE fileid[MAX_FILE_NUM];
int num=0;
int totalpacket[MAX_FILE_NUM]; //用来装每个文件的总包数
CString m_packetsend;
char ch1[10],ch2[10];
char ch3[10];
UINT filefasong(LPVOID param)
{
int temp;
for(temp=0;temp<file_num;temp++)
{
ts_count[temp]=0x10;
}
if((m_pSourceFile=fopen(filename[0],"rb"))==NULL)
{
AfxMessageBox("文件无法打开");
return 0;
}
::PostMessage((HWND)param,WM_totalpacket,0,0);//计算总包数
/*CString m_str="";
char ch4[10];
_itoa(totalpacket[num+1],ch4,10);
m_str+=ch4;
AfxMessageBox(m_str);*/
if(bst_init(cardnumber)!=0) //0成功 负数 失败
{
::PostMessage((HWND)param,WM_cardinitfail,0,0);
return 0;
}
::PostMessage((HWND)param,WM_cardinitsuccess,0,0);
if(bst_start_transmit(rate,frame,cardnumber)!=0) //返回值:0表示成功.负数表示失败.
{
::PostMessage((HWND)param,WM_cardtraminit,0,0);
return 0;
}
///上面的就是对发送卡的初始化
while(1)
{
while(position<senddatalength)
{ //ts_count[num]=count;
memcpy(buffer,&ts_top,1); //把同步字节放在BUFFER的第1个字节中
memcpy(buffer+1,&ts_hiPID,1); //把PID字节放在BUFFER的第2个字节中
memcpy(buffer+2,&ts_PID,1); //把PID字节放在BUFFER的第3个字节中
memcpy(buffer+4,&fileid[num],1); //把文件标识放在第5的一个字节中 占一个
memcpy(buffer+5,&totalpacket[num],4);//把总包数放在BUFFER的第6,7,8,9个字节中,占4个字节
memcpy(buffer+3,&ts_count[num],1); //把计数放在BUFFER的第4个字节中,占1个字节
ts_count[num]++;
if(ts_count[num]>0x1f)
{
count=0x10;
}
memcpy(buffer+9,&ts_sendpacket,4); //把发送包数放在BUFFER的第10,11,12,13个字节中,占4个字节
ts_sendpacket++;
for(i=13;i<frame && !feof(m_pSourceFile);i++)
buffer[i]=fgetc(m_pSourceFile);//把数据放入buffer中
while(i<frame) //若文件不够188字节就全部添为0
{
buffer[i]=0;
i++;
}
memcpy(&pbuffer[position],buffer,188); //丢到大包里
position=position+frame;
if(feof(m_pSourceFile))//如果检测到文件已经结束(已经发送完)
{
if(m_pSourceFile)//如果源文件还处于打开状态
{
fclose(m_pSourceFile);//关闭filename[num-1]的文件
}
ts_sendpacket=0;
num++;
if(num==file_num)
{
num=0;
}
if((m_pSourceFile=fopen(filename[num],"rb"))==NULL)
{
AfxMessageBox("文件无法打开");
return 0;
}
}
if(stop)
{
::PostMessage((HWND)param,WM_cardend,0,0);//发送卡接结束
if(m_pSourceFile)//如果源文件还处于打开状态
{
fclose(m_pSourceFile);//关闭源文件
}
stop=FALSE;
num=0;
return 0;
}
}
int fasong=bst_transmit(&pbuffer,senddatalength,cardnumber);
yijingfasong+=fasong;
if(fasong<=0) // 返回多少字节是成功 负数失败
{
::PostMessage((HWND)param,WM_cardtranmitfail,0,0); //发送卡发送
return 0;
}
::Sleep(50);
//::PostMessage((HWND)param,WM_pbufferwrite,0,0);//写到文件里面去
::PostMessage((HWND)param,WM_sendpacket,0,0);
//::PostMessage((HWND)param,WM_cardtranmitsuccess,0,0);//发送卡发送
position=0;
}
return 0;
}
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFilesendDlg dialog
CFilesendDlg::CFilesendDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFilesendDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFilesendDlg)
m_filename = _T("");
m_rate = 6875000.0f;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFilesendDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFilesendDlg)
DDX_Control(pDX, IDC_BEIZHU, m_beizhu);
DDX_Control(pDX, IDC_FILELIST, m_filelist);
DDX_Control(pDX, IDC_BTSTOP, m_stop);
DDX_Control(pDX, IDC_BTSEND, m_send);
DDX_Text(pDX, IDC_FILENAME, m_filename);
DDX_Text(pDX, IDC_RATE, m_rate);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFilesendDlg, CDialog)
//{{AFX_MSG_MAP(CFilesendDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTLIULAN, OnBtliulan)
ON_BN_CLICKED(IDC_BTLISTADD, OnBtlistadd)
ON_BN_CLICKED(IDC_BTLISTDELETE, OnBtlistdelete)
ON_BN_CLICKED(IDC_BTSEND, OnBtsend)
ON_BN_CLICKED(IDC_BTSTOP, OnBtstop)
ON_BN_CLICKED(IDC_BTUCLINFO, OnBtuclinfo)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_totalpacket,filetotalpacket)//求总包数函数的消息映射
ON_MESSAGE(WM_sendpacket,filesendpacket)
ON_MESSAGE(WM_cardinitfail,cardinitfail)
ON_MESSAGE(WM_cardinitsuccess,cardinitsuccess) //发送卡初始化函数的消息映射
ON_MESSAGE(WM_cardend,cardend) //发送卡结束函数的消息映射
ON_MESSAGE(WM_cardtraminit,cardtraminit) //发送发送前初始化的消息映射
ON_MESSAGE(WM_cardtranmitfail,cardtranmitfail)
// ON_MESSAGE(WM_cardtranmitsuccess,cardtranmitsuccess)//发送卡发送成功与失败的消息映射
//ON_MESSAGE(WM_pbufferwrite,pbufferwrite)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFilesendDlg message handlers
BOOL CFilesendDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -