📄 messagetestdlg.cpp
字号:
Byte_String(SCTS,RTime,7);
time.Format("%c%c年%c%c月%c%c日%c%c时%c%c分%c%c秒",RTime[0],RTime[1],RTime[2],RTime[3],RTime[4],RTime[5],RTime[6],RTime[7],RTime[8],RTime[9],RTime[10],RTime[11]); /*get send time*/
time+=" ";
buf_pointer+=7;
switch(TP_DCS)
{
case DCS_7bit:
{
bit7_Decode(buf_pointer+1,TP_UD_7bit,(int)*buf_pointer);
content.Format("%s",TP_UD_7bit); /*get content*/
}
break;
case DCS_8bit:
{
bit8_Decode(buf_pointer+1,TP_UD_8bit,(int)*buf_pointer);
Byte_String(TP_UD_8bit,RContent,(int)*buf_pointer);
content.Format("%s",RContent); /*get content*/
}
break;
case DCS_UCS2:
{
UCS2_Decode(buf_pointer+1,TP_UD_UCS2,(int)*buf_pointer);
content.Format("%s",TP_UD_UCS2);
}
break;
default:break;
}
m_nRContent.AddString(rnum+time+cnum+content);
UpdateData(FALSE);
}
return TRUE;
}
void CMessageTestDlg::OnDecode() //"解码":对接收到的编码进行解码
{
// TODO: Add your control notification handler code here
Decode();
}
//编码函数
BOOL CMessageTestDlg::Encode()
{
unsigned char SCA[16]; /*short message service centre address*/
unsigned char TA[16]; /*target address*/
unsigned char TP_PID=0; /*protocol id,0 represent normal GSM type,point to point style*/
unsigned char TP_DCS; /*encode style,0x00,0x04 or 0x08*/
char TP_UD[256]; /*user data*/
int TP_UD_Len; /*user data length*/
//char SMS; /*short message sequence*/
unsigned char Send_Buf[256];/*send buffer*/
unsigned char *buf_pointer; /*point to receive buffer*/
char temp[256]; /*temporary buffer for display*/
BOOL flag1=FALSE;
BOOL flag2=FALSE;
if(UpdateData(TRUE)==TRUE)
{
buf_pointer=Send_Buf;
if(m_nSCenterNum.GetAt(0)=='+') //如果输入的号码以+86开头,去除+86
{
m_nSCenterNum=m_nSCenterNum.Right(m_nSCenterNum.GetLength()-3); //取m_nSCenterNum的右(总长度-3)个字符
flag1=TRUE;
}
if(m_nSCenterNum.GetLength() & 1)
m_nSCenterNum+='F';
String_Byte(m_nSCenterNum.GetBuffer(m_nSCenterNum.GetLength()),SCA+1,m_nSCenterNum.GetLength()); /*get message service center address*/
m_nSCenterNum.ReleaseBuffer();
SCA[0]=0x86;
*buf_pointer=m_nSCenterNum.GetLength()/2+2; //含91和86两个字节
buf_pointer++;
*buf_pointer=0x91;
buf_pointer++;
Address_Convert(SCA,buf_pointer,(int)(Send_Buf[0]-1));
buf_pointer+=Send_Buf[0]-1;
*buf_pointer=0x11;
buf_pointer++;
*buf_pointer=0x00;
buf_pointer++;
if(m_nSNum.GetAt(0)=='+') //如果输入的号码以+86开头,去除+86
{
m_nSNum=m_nSNum.Right(m_nSNum.GetLength()-3); //取m_nSCenterNum的右(总长度-3)个字符
flag2=TRUE;
}
*buf_pointer=m_nSNum.GetLength()+2; //含8和6两位号码
buf_pointer++;
*buf_pointer=0x91;
buf_pointer++;
if(m_nSNum.GetLength() & 1)
m_nSNum+='F';
String_Byte(m_nSNum.GetBuffer(m_nSNum.GetLength()),TA+1,m_nSNum.GetLength()); /*get send address*/
m_nSNum.ReleaseBuffer();
TA[0]=0x86;
Address_Convert(TA,buf_pointer,m_nSNum.GetLength()/2+1); //含86一个字节
buf_pointer+=m_nSNum.GetLength()/2+1;
*buf_pointer=TP_PID;
buf_pointer++;
strcpy(TP_UD,m_nSContent.GetBuffer(m_nSContent.GetLength()));
m_nSContent.ReleaseBuffer();
for(unsigned int i=0;i<strlen(TP_UD);i++)
{
if(TP_UD[i]<0 || TP_UD[i]>127)
break;
}
if(i==strlen(TP_UD))
TP_DCS=DCS_7bit;
else
TP_DCS=DCS_UCS2;
*buf_pointer=TP_DCS;
buf_pointer++;
*buf_pointer=0x00;
buf_pointer++;
switch(TP_DCS)
{
case DCS_7bit:
TP_UD_Len=bit7_Encode(TP_UD,buf_pointer+1,(int)strlen(TP_UD));
break;
case DCS_8bit:
TP_UD_Len=bit8_Encode(TP_UD,buf_pointer+1,(int)strlen(TP_UD));
break;
case DCS_UCS2:
TP_UD_Len=UCS2_Encode(TP_UD,buf_pointer+1,(int)strlen(TP_UD));
break;
default:break;
}
*buf_pointer=(unsigned char)TP_UD_Len;
buf_pointer+=TP_UD_Len;
Byte_String(Send_Buf,temp,(int)(buf_pointer-Send_Buf+1));
m_nSEncode.Format("%s",temp);
if(m_nSCenterNum.GetAt(m_nSCenterNum.GetLength()-1)=='F')
m_nSCenterNum=m_nSCenterNum.Left(m_nSCenterNum.GetLength()-1);
if(m_nSNum.GetAt(m_nSNum.GetLength()-1)=='F')
m_nSNum=m_nSNum.Left(m_nSNum.GetLength()-1);
if(flag1==TRUE)
m_nSCenterNum="+86"+m_nSCenterNum;
if(flag2==TRUE)
m_nSNum="+86"+m_nSNum;
UpdateData(FALSE);
}
return TRUE;
}
void CMessageTestDlg::OnEncode() //"编码":将待发送的信息进行编码
{
// TODO: Add your control notification handler code here
Encode();
}
//打开连接,入口参数为串口号和波特率,典型值为1,115200
BOOL CMessageTestDlg::OpenConnection(int nPort,int nBaud)
{
DCB dcb;
char szPort[15];
COMMTIMEOUTS CommTimeOuts;
if(m_bConnected)
return TRUE; //如果串口已经打开,直接返回TRUE
//串口号赋给字符型数组
wsprintf(szPort,"COM%d",nPort);
//打开COMFile串口,可读、可写、不共享、无安全扫描、打开已存在文件、重置操作
COMFile=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(COMFile==NULL) //打开操作失败
return FALSE;
//为WM_COMMNOTIFY消息创建事件对象,手工重置,初始化为有信号
if((m_hMsgEvent=CreateEvent(NULL,TRUE,TRUE,NULL))==NULL)
return FALSE;
//初始化用于重置读/写的OVERLAPPED结构
memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
//为重置读/写创建事件对象,手工重置,初始化为无信号
if((m_OverlappedRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL)
return FALSE;
if((m_OverlappedWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL)
return FALSE;
//设置读/写缓冲区大小均为2048
SetupComm(COMFile,2048,2048);
//刷新缓冲区
PurgeComm(COMFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
//指定监视事件EV_RXCHAR,该事件表示接收到任何字符并放入缓冲区
SetCommMask(COMFile,EV_RXCHAR);
//串口超时参数设置
//一读完接收缓冲区就完成读操作
CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier=0;
CommTimeOuts.ReadTotalTimeoutConstant=0;
//设置写超时以指定WriteCommBlock成员函数中的GetOverlappedResult函数的等待时间
CommTimeOuts.WriteTotalTimeoutMultiplier=50;
CommTimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(COMFile,&CommTimeOuts);
//设置串口参数:波特率;停止位1个;无校验;8位
if(!GetCommState(COMFile,&dcb))
return FALSE;
dcb.DCBlength=sizeof(DCB); //DCB的结构长度
dcb.BaudRate=nBaud; //波特率
dcb.StopBits=ONESTOPBIT; //1位停止位
dcb.Parity=NOPARITY; //无校验位
dcb.ByteSize=8; //数据位为8位
//流量控制:无
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.fOutxCtsFlow=0;
dcb.fInX=dcb.fOutX=0;
dcb.XonChar=ASCII_XON;
dcb.XoffChar=ASCII_XOFF;
dcb.XonLim=50;
dcb.XoffLim=50;
dcb.fBinary=TRUE;
dcb.fParity=TRUE;
if(SetCommState(COMFile,&dcb)) //根据设备控制块配置通信设备
{
//创建等待线程
m_pThread=AfxBeginThread(ComProcess, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
if(m_pThread==NULL)
return FALSE;
else
{
m_bConnected=TRUE;
m_pThread->ResumeThread(); //恢复线程执行
}
}
else
return FALSE;
return m_bConnected;
}
void CMessageTestDlg::OnOpencom() //"连接":打开串口
{
// TODO: Add your control notification handler code here
char COMx[8];
DWORD dwError;
//打开串口,准备读串口
if(UpdateData(TRUE)==TRUE)
{
strcpy(COMx,m_nComSelect.GetBuffer(m_nComSelect.GetLength()));
m_nComSelect.ReleaseBuffer();
if(OpenConnection((int)(COMx[3]-0x30),115200)==FALSE)
{
dwError=GetLastError();
if(m_hMsgEvent!=NULL)
CloseHandle(m_hMsgEvent);
if(m_OverlappedRead.hEvent!=NULL)
CloseHandle(m_OverlappedRead.hEvent);
if(m_OverlappedWrite.hEvent!=NULL)
CloseHandle(m_OverlappedWrite.hEvent);
CloseHandle(COMFile);
}
}
}
//关闭连接
BOOL CMessageTestDlg::CloseConnection()
{
if(m_bConnected==FALSE)
return TRUE;
m_bConnected=FALSE;
//结束ComProcess线程中WaitSingleObject函数的等待
SetEvent(m_hMsgEvent);
//结束ComProcess线程中WaitCommEvent函数的等待
SetCommMask(COMFile,0);
//等待辅助线程终止
WaitForSingleObject(m_pThread->m_hThread, INFINITE);
m_pThread=NULL;
//丢弃通信资源的输出或输入缓冲区字符并终止在通信资源上挂起的读写操作
PurgeComm(COMFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
//关闭串口句柄
CloseHandle(COMFile);
return TRUE;
}
void CMessageTestDlg::OnClosecom() //"断开":关闭串口
{
// TODO: Add your control notification handler code here
CloseConnection();
}
//读串口数据,入口参数为接收缓冲区字符型数组的起始地址和长度
DWORD CMessageTestDlg::ReadCommBlock(LPSTR lpszBlock,DWORD dwBytesRead)
{
DWORD dwErrorFlags;
COMSTAT ComStat;
//清除错误标志并返回设备当前状态信息
ClearCommError(COMFile,&dwErrorFlags,&ComStat);
//如果指定要读的字符数大于接收缓冲区中实际字符数,取最小值
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
ReadFile(COMFile,lpszBlock,dwBytesRead,&dwBytesRead,&m_OverlappedRead);
return dwBytesRead;
}
//写数据到串口,入口参数为发送数据缓冲区字符型数组的起始地址和长度
DWORD CMessageTestDlg::WriteCommBlock(LPSTR lpBlock,DWORD dwBytesWritten)
{
DWORD dwErrorFlags;
COMSTAT ComStat;
BOOL bWriteStat;
//清除错误标志并返回设备当前状态信息
ClearCommError(COMFile,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(COMFile,lpBlock,dwBytesWritten,&dwBytesWritten,&m_OverlappedWrite);
if(!bWriteStat)
{
//如果写操作还未完成,继续等待
if(GetLastError()==ERROR_IO_PENDING)
GetOverlappedResult(COMFile,&m_OverlappedWrite,&dwBytesWritten,TRUE);
else
dwBytesWritten=0;
}
return dwBytesWritten;
}
void CMessageTestDlg::OnSendcom() //"发送":发送消息前,先进行消息编码
{
// TODO: Add your control notification handler code here
DWORD len;
char Buf[256];
//如果串口未打开,不进行响应
if(m_bConnected==FALSE)
return;
Encode();
strcpy(Buf,m_nSEncode.GetBuffer(m_nSEncode.GetLength()));
m_nSEncode.ReleaseBuffer();
len=WriteCommBlock(Buf,strlen(Buf));
}
void CMessageTestDlg::OnSetcenternum() //"设置":设置消息中心号码,并保存到存储器里
{
// TODO: Add your control notification handler code here
}
void CMessageTestDlg::OnGetcenternum() //"读取":从存储器里读取上次设置的消息中心号码
{
// TODO: Add your control notification handler code here
char DefaultCenterNum[16]="+8613800564500";
if(UpdateData(TRUE)==TRUE)
{
m_nSCenterNum.Format("%s",DefaultCenterNum);
UpdateData(FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -