📄 serialtooldlg.cpp
字号:
// TODO: Add your command handler code here
bool bRtn;
//打开串口
if(m_ThreadSerial.ComIsOpen())
{
AfxMessageBox("串口已经打开!");
return;
}
else
{
bRtn = m_ThreadSerial.InitComm(m_nCom, m_hWnd);
if(bRtn)
{
//串口初使化成功
//AfxMessageBox("串口初使化成功!");
}
else
{
//串口初使化失败
AfxMessageBox("串口初使化失败!");
return;
}
}
//是否启动了线程
if(m_ThreadSerial.ComIsConnected())
{
AfxMessageBox("线程已经启动!");
return;
}
else
{
//开始接收
bRtn = m_ThreadSerial.BeginComm();
if(bRtn)
{
//启动线程成功
// AfxMessageBox("启动线程成功!");
}
else
{
//启动线程失败
AfxMessageBox("启动线程失败!");
return;
}
}
}
void CSerialToolDlg::OnMenuitemClosecom()
{
// TODO: Add your command handler code here
m_ThreadSerial.CloseComm();
}
void CSerialToolDlg::OnMenuitemSetnet()
{
// TODO: Add your command handler code here
CSetupNetDlg dlg;
dlg.DoModal();
}
UINT SockThread(LPVOID p)
{
int nRtn=1;
char buff[BUFFLEN];
CSerialToolDlg *dlg=(CSerialToolDlg*)AfxGetApp()->GetMainWnd();
int nIndex = dlg->GetSockCount();
if(nIndex!=-1)
{
//说明还有空的SOCKET
dlg->m_sock[nIndex]=accept(dlg->m_sockServer,(sockaddr*)&(dlg->m_sockaddr),&(dlg->m_nAddlen));
if (dlg->m_sock[nIndex]==INVALID_SOCKET)
{
//发生连接错误
//AfxMessageBox("发生连接错误");
dlg->m_sock[nIndex]=NULL;
return -1;
}
else
{
AfxBeginThread(&SockThread,0);
while(nRtn!=SOCKET_ERROR)
{
ZeroMemory(buff,sizeof(buff));
nRtn=recv(dlg->m_sock[nIndex],buff,READBUFFLEN,MSG_PEEK);
if(nRtn==8)
{
nRtn=recv(dlg->m_sock[nIndex],buff,READBUFFLEN,0);
if(nRtn!=SOCKET_ERROR)
{
dlg->DealNetworkData(buff);
}
}
}
}
}
return 0;
}
void CSerialToolDlg::OnMenuitemOpennet()
{
// TODO: Add your command handler code here
//设定地址
if(m_sockServer!=NULL)
{
AfxMessageBox("服务已经开启!");
return;
}
m_sockaddr.sin_addr.s_addr=inet_addr(m_szIP);//inet_addr(m_szIP);//htonl(INADDR_ANY);
m_sockaddr.sin_family=AF_INET;
m_sockaddr.sin_port=htons(m_nPort);//htons(5000);
m_nAddlen=sizeof(m_sockaddr);
m_sockServer=socket(AF_INET,SOCK_STREAM,0);//IPPROTO_TCP
if (bind(m_sockServer,(sockaddr*)&m_sockaddr,m_nAddlen))
{
AfxMessageBox("绑定错误");
}
else
{
AfxMessageBox("服务器创建成功");
//开始侦听
listen(m_sockServer,5);
//调用线程
AfxBeginThread(&SockThread,0);
}
}
//取得当前的空的SOCKET索引,如果没有空的,那么返回-1
int CSerialToolDlg::GetSockCount()
{
for (int i=0;i<MAXSOCKET;i++)
{
if (m_sock[i]==NULL)
return i;
}
return -1;
}
void CSerialToolDlg::DealReceiveData(BYTE* pszData)
{
char szData[BUFFLEN];
ZeroMemory(szData,sizeof(szData));
strcpy((char*)szData,(char*)pszData);
char time_str[50];
char szCount[10];
_strtime(time_str);
int nItem;
int nItemCount = m_listTelephone.GetItemCount();
nItemCount++;
nItem=m_listTelephone.InsertItem(0,itoa(nItemCount,szCount,10));
m_listTelephone.SetItemText(nItem,1,time_str);
m_listTelephone.SetItemText(nItem,2,CString(szData));
int nLen=strlen(szData);
szData[nLen]='\n';
for (int i=0;i<MAXSOCKET;i++)
{
if (m_sock[i]!=NULL)
{
send(m_sock[i],szData,nLen+1,0);
}
}
/*
//JSY-2000交换机发给报警台协议:
switch(szData[0])
{
case 'A': //1:报警呼叫 :A N(ZN)W CR LF
break;
case 'B': //2:接警机提机接警:B N W CR LF
break;
case 'C': //3:接警机挂机:C N W CR LF
break;
case 'D': //4:报警呼叫排队等待: D N(ZN)W CR LF
break;
case 'U':
switch(szData[1])
{
case '1': //5:‘技防表’: U1 BB(GN)CR LF
// BB=00~31:‘技防表’序号;
// (GN)0~8位技防电话号码。
break;
case '2': //6:‘锁定表’: U2 BB(SN)CR LF
// BB=00~31:‘锁定表’序号;
//(SN)0~16位锁定电话号码。
break;
}
break;
case 'V':
switch(szData[1])
{
case '0': //7: 报警'锁定’: V0 (SN)W CR LF。
//(SN)是0~16位锁定的主叫电话号码。
break;
case '1': //8:报警'拦截’: V1 (ZN)W CR LF。
break;
case '2': //9:报警'技防’: V2 (GN)(ZN)W CR LF。
//(GN)是0~16位的技防号码。
// 注1:N=1~8为第1~8个接警话机。JSY-2000的第17~24门分机。
// 注2:(ZN)是报警电话的主叫电话号码。
//注3:W 是中继线序号(001~127)
// 注4:CR 是回车,16进=0DH,LF 是走纸,16进=0AH。
break;
}
break;
}
*/
}
void CSerialToolDlg::DealNetworkData(char* pData)
{
char szData[BUFFLEN];
ZeroMemory(szData,sizeof(szData));
strcpy((char*)szData,(char*)pData);
char time_str[50];
char szCount[10];
_strtime(time_str);
int nItem;
int nItemCount = m_listNetwork.GetItemCount();
nItemCount++;
nItem=m_listNetwork.InsertItem(0,itoa(nItemCount,szCount,10));
m_listNetwork.SetItemText(nItem,1,time_str);
m_listNetwork.SetItemText(nItem,2,CString(szData));
m_ThreadSerial.WriteComm((BYTE*)szData,BUFFLEN);
}
void CSerialToolDlg::GetLocalIP(char*szIP)
{
int nRetCode;
CString sHostName;
CString sIPAddress;
nRetCode = StartUp();
nRetCode = GetLocalHostName(sHostName);
nRetCode = GetIPAddress(sHostName, sIPAddress);
nRetCode = CleanUp();
strcpy(szIP,sIPAddress.GetBuffer(sIPAddress.GetLength()));
}
void CSerialToolDlg::OnMenuitemClosenet()
{
// TODO: Add your command handler code here
for(int i=0;i<MAXSOCKET;i++)
{
if(m_sock[i]!=NULL)
{
closesocket(m_sock[i]);
m_sock[i]= NULL;
}
}
if(m_sockServer!=NULL)
{
closesocket(m_sockServer);
m_sockServer=NULL;
}
}
void CSerialToolDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDblClk(nFlags, point);
}
void CSerialToolDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDown(nFlags, point);
}
void CSerialToolDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonUp(nFlags, point);
}
void CSerialToolDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);
}
void CSerialToolDlg::OnBtSendtocom()
{
// TODO: Add your control notification handler code here
char* pData;
CString sSendToCom;
GetDlgItem(IDC_EDIT_SENDTOCOM)->GetWindowText(sSendToCom);
int nLength = sSendToCom.GetLength();
pData = sSendToCom.GetBuffer(nLength);
int nRtn = m_ThreadSerial.WriteComm((BYTE*)pData,nLength);
}
void CSerialToolDlg::OnBtSendtonet()
{
// TODO: Add your control notification handler code here
char* pData;
CString sSendToNet;
GetDlgItem(IDC_EDIT_SENDTONET)->GetWindowText(sSendToNet);
int nLength = sSendToNet.GetLength();
pData = sSendToNet.GetBuffer(nLength);
pData[nLength]='\n';
for (int i=0;i<MAXSOCKET;i++)
{
if (m_sock[i]!=NULL)
{
int nRtn=send(m_sock[i],pData,nLength+1,0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -