?? serialportdlg.cpp
字號:
// SerialPortDlg.cpp : implementation file
//
#include "stdafx.h"
#include "wave.h"
#include "SerialPortDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define INDEX_OF_PERSON 1
#define INDEX_OF_COMMAND 1
/////////////////////////////////////////////////////////////////////////////
// CSerialPortDlg dialog
CSerialPortDlg::~CSerialPortDlg()
{
delete []rcvdArray;
}
CSerialPortDlg::CSerialPortDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerialPortDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSerialPortDlg)
m_strReceiveData = _T("");
m_strSendData = _T("");
//}}AFX_DATA_INIT
n_ReceiveLength = 0;
rcvdArray = new char[2097152];//分配空間2M
reversed = 0;
person_index=INDEX_OF_PERSON;
command_index=INDEX_OF_COMMAND;
person_index2 = INDEX_OF_PERSON;
command_index2 = INDEX_OF_COMMAND;
}
void CSerialPortDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSerialPortDlg)
DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
DDX_Text(pDX, IDC_EDIT_RECEIVE, m_strReceiveData);
DDX_Text(pDX, IDC_EDIT_SEND, m_strSendData);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSerialPortDlg, CDialog)
//{{AFX_MSG_MAP(CSerialPortDlg)
ON_BN_CLICKED(IDC_BUTTON_OpenPort, OnBUTTONOpenPort)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
ON_BN_CLICKED(IDC_BUTTON_SAVEPCM, OnButtonSavepcm)
ON_BN_CLICKED(IDC_BUTTON_SAVEWAV, OnButtonSavewav)
ON_BN_CLICKED(IDC_BUTTON_MANUALSEND, OnButtonManualsend)
ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
ON_BN_CLICKED(IDC_BUTTON_ZANTING, OnButtonZanting)
ON_BN_CLICKED(IDC_BUTTON_CONTINUE, OnButtonContinue)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
ON_BN_CLICKED(IDC_BUTTON_RESTART, OnButtonRestart)
ON_BN_CLICKED(IDC_BUTTON_READFILEBTN, OnButtonReadfilebtn)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSerialPortDlg message handlers
int CSerialPortDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DoModal();
}
BEGIN_EVENTSINK_MAP(CSerialPortDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CSerialPortDlg)
ON_EVENT(CSerialPortDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
//SerialPortDIALOG初始化
BOOL CSerialPortDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
n_ReceiveLength = 0;
reversed = 0;
// person_index=INDEX_OF_PERSON;
// command_index=INDEX_OF_COMMAND;
// person_index2 = INDEX_OF_PERSON;
// command_index2 = INDEX_OF_COMMAND;
GetModuleFileName(NULL,path.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer ();
int nPos;
nPos=path.ReverseFind ('\\');
path=path.Left (nPos);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//串口接收數據并顯示在編輯框
void CSerialPortDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.
for(k=0;k<2048;k++)
{
rxdata[k] = '0';
}
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區內有字符
{ ////////以下你可以根據自己的通信協議加入處理代碼
variant_inp=m_ctrlComm.GetInput(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變量轉換為ColeSafeArray型變量
len=safearray_inp.GetOneDimSize(); //得到有效數據長度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組
}
for(k=0;k<len;k++) //將數組轉換為Cstring型變量
{
BYTE bt=*(char*)(rxdata + k); //字符型
*(rcvdArray + n_ReceiveLength + k) = bt;//rxdata[k];
strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
if(m_strReceiveData.GetLength() < 1024)
m_strReceiveData += "*";//strtemp; //加入接收編輯框對應字符串
else
m_strReceiveData = "";
}
n_ReceiveLength += len;
}
UpdateData(FALSE); //更新編輯框內容
}
//打開端口
void CSerialPortDlg::OnBUTTONOpenPort()
{
// TODO: Add your control notification handler code here
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(1024);
m_ctrlComm.SetCommPort(4); //選擇com4
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
if( !m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(TRUE);//打開串口
::AfxMessageBox("串口打開成功!");
}
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("115200,n,8,1"); //波特率115200,無校驗,8個數據位,1個停止位
m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數據
m_ctrlComm.SetRThreshold(1);
//參數1表示每當串口接收緩沖區中有多于或等于1個字符時將引發一個接收數據的OnComm事件
m_ctrlComm.SetInputLen(0); //設置當前接收區數據長度為0
m_ctrlComm.GetInput();//先預讀緩沖區以清除殘留數據
}
//清空接收區
void CSerialPortDlg::OnButtonClear()
{
// TODO: Add your control notification handler code here
n_ReceiveLength = 0;
m_strReceiveData = "";
reversed = 0;
UpdateData(FALSE); //更新編輯框內容
m_ctrlComm.GetInput();
}
//保存為PCM文件
void CSerialPortDlg::OnButtonSavepcm()
{
// TODO: Add your control notification handler code here
if(n_ReceiveLength == 0)
{
::AfxMessageBox("尚未接收數據");
return;
}
CString ss1,ss2,pcmpath;
ss1.Format("%d",person_index);
ss2.Format("%d",command_index);
//為了讓保存wav文件時的文件名同保存pcm文件時的文件名一致
person_index2 = person_index;
command_index2 = command_index;
if(command_index==4){command_index=1;person_index++;}
else {command_index++;}
//command_index++;
CString pcmName = ss1 + "_" + ss2 + ".pcm";
LPCSTR lpszPath = "C:\\record\\";
SetCurrentDirectory( lpszPath );
static char BASED_CODE szFilter[] = "PCM文件(*.pcm)|*.pcm|所有文件(*.*)|*.*||";
CFileDialog FileDlg( FALSE, "pcm", pcmName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter );
FileDlg.m_ofn.lpstrInitialDir = lpszPath ;
if( FileDlg.DoModal() ==IDOK )
{
CString strFileName = FileDlg.GetFileName();
CString strFileExt = FileDlg.GetFileExt();
CString lpstrName = FileDlg.GetPathName();
pcmFile.Open(lpstrName, CFile::modeCreate | CFile::modeWrite, NULL);
//MSB轉LSB
if(0 == reversed)//尚未轉成LSB
{
for(int i=1;i<n_ReceiveLength;i+=2)
{
BYTE temp = *(rcvdArray+i);
*(rcvdArray+i) = *(rcvdArray+i-1);
*(rcvdArray+i-1) = temp;
}
reversed = 1;
}
pcmFile.Write((BYTE *)rcvdArray,n_ReceiveLength);
pcmFile.Close();
}
// pcmpath="C:\\record\\pcm\\boy\\a";
// CString pcmName = pcmpath + ss1 + "_" + ss2 + ".pcm";
// pcmFile.Open(pcmName,CFile::modeCreate|CFile::modeWrite,NULL);
}
//保存為wav文件
void CSerialPortDlg::OnButtonSavewav()
{
// TODO: Add your control notification handler code here
if(n_ReceiveLength == 0)
{
::AfxMessageBox("尚未接收數據");
return ;
}
CString ss1,ss2,pcmpath;
ss1.Format("%d",person_index2);
ss2.Format("%d",command_index2);
CString waveName = ss1 + "_" + ss2 + ".wav";
LPCSTR lpszPath = "C:\\record\\";
SetCurrentDirectory( lpszPath );
static char BASED_CODE szFilter[] = "WAVE文件(*.wav)|*.wav|所有文件(*.*)|*.*||";
CFileDialog FileDlg( FALSE, "wav", waveName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter );
FileDlg.m_ofn.lpstrInitialDir = lpszPath ;
if( FileDlg.DoModal() ==IDOK )
{
CString strFileName = FileDlg.GetFileName();
CString strFileExt = FileDlg.GetFileExt();
CString lpstrName = FileDlg.GetPathName();
waveFile.Open(lpstrName,CFile::modeCreate|CFile::modeWrite,NULL);
//加wav頭
char RIFF[4] = {'R','I','F','F'};
int size = n_ReceiveLength + 36;
char WAVE[4] = {'W','A','V','E'};
char fmt[4] = {'f','m','t',' '};
int size1 = 16;
short audioFormat = 1;
short channels = 1;
int sampleRate = 8000;
int byteRate = 16000;
short blockAlign = 2;
short bitPerSample = 16;
char data[4] = {'d','a','t','a'};
int size2 = n_ReceiveLength;
char head[44];
::memcpy(head,RIFF,4);
::memcpy(head+4,&size,4);
::memcpy(head+8,WAVE,4);
::memcpy(head+12,fmt,4);
::memcpy(head+16,&size1,4);
::memcpy(head+20,&audioFormat,2);
::memcpy(head+22,&channels,2);
::memcpy(head+24,&sampleRate,4);
::memcpy(head+28,&byteRate,4);
::memcpy(head+32,&blockAlign,2);
::memcpy(head+34,&bitPerSample,2);
::memcpy(head+36,data,4);
::memcpy(head+40,&size2,4);
waveFile.SeekToBegin();
waveFile.Write((char*)head,44);
//MSB轉LSB
if(0 == reversed)//尚未轉成LSB
{
for(int i=1;i<n_ReceiveLength;i+=2)
{
BYTE temp = *(rcvdArray+i);
*(rcvdArray+i) = *(rcvdArray+i-1);
*(rcvdArray+i-1) = temp;
}
reversed = 1;
}
waveFile.Write((char*)rcvdArray,n_ReceiveLength);
waveFile.Close();
}
//清空接收數據
n_ReceiveLength = 0;
m_strReceiveData = "";
reversed = 0;
UpdateData(FALSE); //更新編輯框內容
m_ctrlComm.GetInput();
}
//發送編輯框里的內容
void CSerialPortDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //讀取編輯框內容
m_ctrlComm.SetOutput(COleVariant(m_strSendData));//發送數據
}
//讀文件發送文件內容并顯示在發送框
void CSerialPortDlg::OnButtonReadfilebtn()
{
// TODO: Add your control notification handler code here
LPCSTR lpszPath = "C:\\";
SetCurrentDirectory( lpszPath );
static char BASED_CODE szFilter[] = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||";
CFileDialog FileDlg( TRUE, NULL, NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter );
FileDlg.m_ofn.lpstrInitialDir = lpszPath ;
if( FileDlg.DoModal() ==IDOK )
{
CString strFileName = FileDlg.GetFileName( );
CString strFileExt = FileDlg.GetFileExt( );
CString lpstrName = FileDlg.GetPathName( );
CFile f;
CString str;
f.Open(lpstrName, CFile::modeRead);
int length = f.GetLength();
TCHAR* pBuff = new TCHAR[length+1];
f.Read(pBuff,length);
pBuff[length] = '\0';//pBuff結束符標志
m_strSendData = pBuff;//用于編輯框顯示文本
UpdateData(FALSE);
f.Close();
pBuff = NULL;
CSerialPortDlg::OnButtonManualsend();
}
}
//錄音開始
void CSerialPortDlg::OnButtonStart()
{
// TODO: Add your control notification handler code here
m_ctrlComm.SetInBufferCount(0);
m_strSendData = "000000000000000000000000000000";//30個0
m_ctrlComm.SetOutput(COleVariant(m_strSendData));//發送數據
}
//錄音暫停
void CSerialPortDlg::OnButtonZanting()
{
// TODO: Add your control notification handler code here
m_strSendData = "111111111111111111111111111111";//30個1
m_ctrlComm.SetOutput(COleVariant(m_strSendData));//發送數據
}
//錄音繼續
void CSerialPortDlg::OnButtonContinue()
{
// TODO: Add your control notification handler code here
// m_strSendData = "10";
// m_ctrlComm.SetOutput(COleVariant(m_strSendData));//發送數據
}
//錄音停止
void CSerialPortDlg::OnButtonStop()
{
// TODO: Add your control notification handler code here
// m_strSendData = "11";
// m_ctrlComm.SetOutput(COleVariant(m_strSendData));//發送數據
}
//FPGA重新啟動
void CSerialPortDlg::OnButtonRestart()
{
// TODO: Add your control notification handler code here
// m_strSendData = "111";
// m_ctrlComm.SetOutput(COleVariant(m_strSendData));//發送數據
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -