📄 simsimensdoc.cpp
字号:
//重新设置设备参数,读、写缓冲区大小均为MAXBLOCK
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
//设置监视事件EV_RXCHAR,该事件表示接收倒任何字符并放进接收缓冲区中
SetCommMask(m_hCom,EV_RXCHAR);
//把间隔超时设为最大,把读总超时设为0将导致ReadFile立即返回并完成操作
TimeOuts.ReadIntervalTimeout=5;
TimeOuts.ReadTotalTimeoutMultiplier=5;
TimeOuts.ReadTotalTimeoutConstant=0;
//设置写超时以指定Write成员函数中的GetOverlappedResult函数的等待时间
TimeOuts.WriteTotalTimeoutMultiplier=5;
TimeOuts.WriteTotalTimeoutConstant=20;
SetCommTimeouts(m_hCom,&TimeOuts);
//如果成功设置串口,启动监视串口线程,线程控制函数为CommProc,
//并将当前指针this作为参数传递给CommProc函数
if(ConfigConnection())
{
//创汇建并挂起监视线程
m_pThread=AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
//恢复监视线程运行
if(m_pThread==NULL)
{
CloseHandle(m_hCom);
return FALSE;
}
else
{
m_bConnected=TRUE;
m_pThread->ResumeThread();
}
}
else
{
CloseHandle(m_hCom);
return FALSE;
}
return TRUE;
}
void CSimSimensDoc::CloseConnection() //关闭串口设备
{
//如果已被挂断,返回;否则置m_dConnected为FALSE
if(!m_bConnected)
return;
else
m_bConnected=FALSE;
//结束CommProc线程中WaitForSingleObject的等待
SetEvent(m_hPostMsgEvent);
//结束CommProc线程中WaitCommEvent的等待
SetCommMask(m_hCom,0);
//等待辅助线程终止
WaitForSingleObject(m_pThread->m_hThread,INFINITE);
m_pThread=NULL;
//关闭串口设备句柄
CloseHandle(m_hCom);
return;
}
void CSimSimensDoc::Transmit()
{
// TODO: Add your command handler code here
SetTempStr();
bcc=GetBCC(transmit_str);
bcc=bcc^char(DLE);
bcc=bcc^char(ETX);
m_nStatus=1;
m_nWriteStep=0;
transmit_number=0;
Write(char(STX));
Show_T_STX();
//写串口开始请求
if(rt_STX_number>TXA)
{
Show_TXA_OVER_STX();
EmptyTempStr();
LargeReturnIdle();
LinkError();
}
else
{
if(OutTime(QVZ))
{
Show_QVZ_OUTTIME();
rt_STX_number++;
Transmit();
}
}
return;
}
void CSimSimensDoc::GetTextBegin(CString str)
{
int l=0;
if(str!="")
{
transmit_str[transmit_number]=m_cTextMode;
transmit_number++;
l=str.GetLength();
for(int i=0;i<l;i++)
{
transmit_str[transmit_number]=str.GetAt(i);
transmit_number++;
}
}
else
{
transmit_str[transmit_number]=m_cTextMode;
transmit_number++;
}
return;
}
void CSimSimensDoc::GetText(CString str)
{
int l=0;
if(str!="")
{
transmit_str[transmit_number]=':';
transmit_number++;
l=str.GetLength();
for(int i=0;i<l;i++)
{
transmit_str[transmit_number]=str.GetAt(i);
transmit_number++;
}
}
return;
}
void CSimSimensDoc::SetText()
{
receive_number=0;
m_cTextMode=receive_str[receive_number];
receive_number++;
AntiRectifyText();
bool b=false;
b=SetData(m_sD1);
if(b)
b=SetData(m_sD2);
else
return;
if(b)
b=SetData(m_sD3);
else
return;
if(b)
b=SetData(m_sD4);
else
return;
if(b)
b=SetData(m_sD5);
else
return;
}
bool CSimSimensDoc::SetData(CString &str)
{
do
{
if(receive_str[receive_number]==':')
{
receive_number++;
if(receive_str[receive_number]==char('DLE'))
{
receive_number++;
if(receive_str[receive_number]==char('ETX'))
{
EmptyRString();
return false;
}
else
{
receive_number-=1;
return true;
}
}
else
{
return true;
}
}
else
{
if(receive_str[receive_number]==char(DLE))
{
receive_number++;
if(receive_str[receive_number]==char(ETX))
return false;
else
{
str+=char(DLE);
receive_number++;
}
}
else
{
str+=receive_str[receive_number];
receive_number++;
}
}
}while(true);
}
void CSimSimensDoc::Rectify()
{
switch(m_nBaud) //校正波特率
{
case 0:
m_nBaud=300;
break;
case 1:
m_nBaud=600;
break;
case 2:
m_nBaud=1200;
break;
case 3:
m_nBaud=2400;
break;
case 4:
m_nBaud=9600;
break;
case 5:
m_nBaud=14400;
break;
case 6:
m_nBaud=19200;
break;
case 7:
m_nBaud=38400;
break;
case 8:
m_nBaud=57600;
break;
default:;
}
m_nDataBits=m_nDataBits+5; //校正数据位
switch(m_nPort) //校正端口名
{
case 0:
m_sPort="COM1";
break;
case 1:
m_sPort="COM2";
break;
case 2:
m_sPort="COM3";
break;
case 3:
m_sPort="COM4";
break;
default:;
}
return;
}
void CSimSimensDoc::AntiRectify()
{
switch(m_nBaud/100) //反校正波特率
{
case 3:
m_nBaud=0;
break;
case 6:
m_nBaud=1;
break;
case 12:
m_nBaud=2;
break;
case 24:
m_nBaud=3;
break;
case 96:
m_nBaud=4;
break;
case 144:
m_nBaud=5;
break;
case 192:
m_nBaud=6;
break;
case 384:
m_nBaud=7;
break;
case 576:
m_nBaud=8;
break;
default:;
}
m_nDataBits=m_nDataBits-5; //反校正数据位
return;
}
void CSimSimensDoc::RectifyText()
{
switch(m_nTextMode) //校正消息类型
{
case 0:
m_cTextMode='N';
break;
case 1:
m_cTextMode='M';
break;
case 2:
m_cTextMode='E';
break;
case 3:
m_cTextMode='P';
break;
case 4:
m_cTextMode='R';
break;
case 5:
m_cTextMode='D';
break;
case 6:
m_cTextMode='T';
break;
default:;
}
return;
}
void CSimSimensDoc::AntiRectifyText()
{
switch(m_cTextMode) //反校正消息类型
{
case 'N':
m_nTextMode=0;
break;
case 'M':
m_nTextMode=1;
break;
case 'E':
m_nTextMode=2;
break;
case 'P':
m_nTextMode=3;
break;
case 'R':
m_nTextMode=4;
break;
case 'D':
m_nTextMode=5;
break;
case 'T':
m_nTextMode=6;
break;
default:;
}
return;
}
void CSimSimensDoc::EmptyTString()
{
for(int i=0;i<MAXBLOCK/4;i++)
{
transmit_str[i]=0;
}
transmit_number=0;
return;
}
void CSimSimensDoc::EmptyRString()
{
for(int i=0;i<MAXBLOCK/4;i++)
{
receive_str[i]=0;
}
receive_number=0;
return;
}
void CSimSimensDoc::SetTempStr()
{
for(int i=0;i<MAXBLOCK/4;i++)
{
temp_str[i]=transmit_str[i];
}
return;
}
void CSimSimensDoc::EmptyTempStr()
{
for(int i=0;i<MAXBLOCK/4;i++)
{
temp_str[i]=0;
}
return;
}
void CSimSimensDoc::SetTString()
{
for(int i=0;i<MAXBLOCK/4;i++)
{
transmit_str[i]=temp_str[i];
}
return;
}
void CSimSimensDoc::LinkError()
{
AfxMessageBox("A link failure!");
return;
}
bool CSimSimensDoc::OutTime(DWORD times)
{
COMSTAT ComStat;
DWORD dwErrorFlags;
for(int i=0;i<int(times/10);i++)
{
::Sleep(10);
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
return false;
}
}
return true;
}
bool CSimSimensDoc::TextEnd(char string[MAXBLOCK/4])
{
for(int i=0;i<MAXBLOCK/4;i++)
{
if(string[i]!=NULL)
return false;
}
return true;
}
char CSimSimensDoc::GetBCC(char string[MAXBLOCK/4])
{
char c=NULL;
for(int i=0;i<MAXBLOCK/4;i++)
c=c^string[i];
return c;
}
bool CSimSimensDoc::CheckBCC(char c)
{
char check=NULL;
check=GetBCC(receive_str);
if(c==check)
return true;
else
return false;
}
void CSimSimensDoc::SmallReturnIdle()
{
m_nStatus=0;
m_nReadStep=0;
m_nWriteStep=0;
rt_STX_number=0;
EmptyTString();
no_error=true;
return;
}
void CSimSimensDoc::LargeReturnIdle()
{
m_nStatus=0;
m_nReadStep=0;
m_nWriteStep=0;
rt_STX_number=0;
rt_number=0;
rr_number=0;
EmptyTString();
no_error=true;
return;
}
void CSimSimensDoc::ReplaceData(CString string)
{
int length=string.GetLength();
if(length&1)
{
string+=':';
length++;
}
for(int i=0;i<length;i++)
transmit_str[i]=string.GetAt(i);
Transmit();
return;
}
char CSimSimensDoc::Read()
{
char c=NULL;
char * buf=&c;
DWORD Length=1;
COMSTAT ComStat;
DWORD dwErrorFlags;
//清除错误标志并返回设备当前状态信息
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
//读操作
ReadFile(m_hCom,buf,Length,&Length,&m_osRead);
return c;
}
DWORD CSimSimensDoc::Write(char c)
{
// ::Sleep(10);
DWORD Length=1;
char * buf=&c;
BOOL fState;
COMSTAT ComStat;
DWORD dwErrorFlags;
//清除错误标志并返回设备当前状态信息
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
//写操作
fState=WriteFile(m_hCom,buf,Length,&Length,&m_osWrite);
if(!fState)
{
//如果写操作还未完成,继续等待
if(GetLastError()==ERROR_IO_PENDING)
GetOverlappedResult(m_hCom,&m_osWrite,&Length,TRUE);
else
Length=0;
}
return Length;
}
void CSimSimensDoc::WriteText()
{
while(!TextEnd(transmit_str))
{
tc=transmit_str[transmit_number];
if(tc==char(DLE))
{
transmit_str[transmit_number]=NULL;
Write(char(DLE));
Write(char(DLE));
transmit_number++;
Check();
}
else
{
transmit_str[transmit_number]=NULL;
Write(tc);
transmit_number++;
Check();
}
}
transmit_number=0;
Write(char(DLE));
Check();
Write(char(ETX));
Check();
Write(bcc);
Show_T_DLEETXBCC();
if(OutTime(QVZ))
{
Show_QVZ_OUTTIME();
Show_T_TEXT_UNSUCCESS();
ReTransmit();
}
return;
}
void CSimSimensDoc::Check()
{
COMSTAT ComStat;
DWORD dwErrorFlags;
char c=NULL;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
c=Read();
if(c!=NULL)
{
if(c==char(NAK))
Show_R_NAK();
else
{
Show_R_OTHER();
::Sleep(ZVZ);
Write(char(NAK));
Show_T_NAK();
}
ReTransmit();
}
}
return;
}
void CSimSimensDoc::ReTransmit()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -