基本信息
源码名称:c++ 监控modbus工具源码
源码大小:5.01M
文件格式:.zip
开发语言:C/C++
更新时间:2019-08-17
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
modbus上位机测试源码
modbus上位机测试源码
// jkModbusDlg.cpp : implementation file // #include "stdafx.h" #include "jkModbus.h" #include "jkModbusDlg.h" #include "DlgComSet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About BYTE CJkModbusDlg::m_bytLocalYXData[512] = \ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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() ///////////////////////////////////////////////////////////////////////////// // CJkModbusDlg dialog CJkModbusDlg::CJkModbusDlg(CWnd* pParent /*=NULL*/) : CDialog(CJkModbusDlg::IDD, pParent) { //{{AFX_DATA_INIT(CJkModbusDlg) m_bytCommand = 02; m_dwDataLenth = 01; m_nIDNumber = 0; m_nRead = 0; m_bytSlaveAddress = 01; m_dwStartAddress = 0; m_bytStateValue = 0; m_nYXNum = 512; m_szSendView = _T(""); m_szReceiveView = _T(""); m_chkContinualSend = FALSE; m_dwInterval = 2000; m_nSendTimes = 0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); for(int i=0; i<512; i ) { m_bytDatas[i] = 0x00; } bytComand = 0x01; m_bSendok = false; /* //公共数据成员 m_szPortName="COM1"; //串口名 m_lBaudRate=9600; //波特率 m_nParity=NOPARITY; //校验方式 */ } void CJkModbusDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CJkModbusDlg) DDX_Control(pDX, IDC_RECEIVEVIEW, m_edtReceiveView); DDX_Control(pDX, IDC_SENDVIEW, m_edtSendView); DDX_Text(pDX, IDC_COMMAND, m_bytCommand); DDV_MinMaxByte(pDX, m_bytCommand, 0, 255); DDX_Text(pDX, IDC_DATALENTH, m_dwDataLenth); DDX_Text(pDX, IDC_IDNUMBER, m_nIDNumber); DDX_Radio(pDX, IDC_READ, m_nRead); DDX_Text(pDX, IDC_SLAVEADDRESS, m_bytSlaveAddress); DDV_MinMaxByte(pDX, m_bytSlaveAddress, 0, 40); DDX_Text(pDX, IDC_STARTADDRESS, m_dwStartAddress); DDX_Text(pDX, IDC_STATEVALUE, m_bytStateValue); DDV_MinMaxByte(pDX, m_bytStateValue, 0, 2); DDX_Text(pDX, IDC_YXNUM, m_nYXNum); DDX_Text(pDX, IDC_SENDVIEW, m_szSendView); DDX_Text(pDX, IDC_RECEIVEVIEW, m_szReceiveView); DDX_Check(pDX, IDC_CONTINUESEND, m_chkContinualSend); DDX_Text(pDX, IDC_INTERVALTIME, m_dwInterval); DDX_Text(pDX, IDC_SENDTIMES, m_nSendTimes); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CJkModbusDlg, CDialog) //{{AFX_MSG_MAP(CJkModbusDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_PRODUCEMESSAGE, OnProducemessage) ON_BN_CLICKED(IDC_WRITEVALUE, OnWritevalue) ON_BN_CLICKED(IDC_ALLDISPART, OnAlldispart) ON_BN_CLICKED(IDC_ALLSHUT, OnAllshut) ON_BN_CLICKED(IDC_CLEARSEND, OnClearsend) ON_BN_CLICKED(IDC_CLEARRECEIVE, OnClearreceive) ON_COMMAND(ID_COMMSET, OnCommset) ON_COMMAND(ID_COMMOPEN, OnCommopen) ON_COMMAND(ID_COMMCLOSE, OnCommclose) ON_BN_CLICKED(IDC_SENDDATA, OnSenddata) ON_UPDATE_COMMAND_UI(ID_COMMOPEN, OnUpdateCommopen) ON_UPDATE_COMMAND_UI(ID_COMMCLOSE, OnUpdateCommclose) ON_WM_TIMER() ON_BN_CLICKED(IDC_CONTINUESEND, OnContinuesend) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CJkModbusDlg message handlers BOOL CJkModbusDlg::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); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here crc = new Crc(16,0X8005,1,0XFFFF,0);//初始化校验 m_Com = new CComControl(this->m_hWnd); YxFrameNum=0; return TRUE; // return TRUE unless you set the focus to a control } void CJkModbusDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CJkModbusDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon 1) / 2; int y = (rect.Height() - cyIcon 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CJkModbusDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } int CJkModbusDlg::ReadFrame(BYTE* ucharReadFrame,BYTE ReadFrame[]) { UpdateData(); ReadFrame[0] = 0X01; ucharReadFrame = ReadFrame; int ReadFrameNum = 0; BYTE bytSlaveAddress=m_bytSlaveAddress;//0X01; ReadFrame[ReadFrameNum ] = bytSlaveAddress;//从站地址 if(!m_nRead)bytComand = m_bytCommand;//0X02; ReadFrame[ReadFrameNum ] = bytComand;//功能码 BYTE bytHightStartAddress=HIBYTE(m_dwStartAddress); BYTE bytLowStartAddress=LOBYTE(m_dwStartAddress); ReadFrame[ReadFrameNum ] = bytHightStartAddress;//开始地址 ReadFrame[ReadFrameNum ] = bytLowStartAddress; BYTE bytHightDataLenth=HIBYTE(m_dwDataLenth);//0X00; BYTE bytLowDataLenth=LOBYTE(m_dwDataLenth);//0X01; ReadFrame[ReadFrameNum ] = bytHightDataLenth;//数据长度 ReadFrame[ReadFrameNum ] = bytLowDataLenth; WORD CRC; CRC=GetCrc(ReadFrame,ReadFrameNum); BYTE bytLowCRC=LOBYTE(CRC); BYTE bytHightCRC= HIBYTE(CRC); ReadFrame[ReadFrameNum ] = bytLowCRC; ReadFrame[ReadFrameNum ] = bytHightCRC; ucharReadFrame=&ReadFrame[0]; UpdateData(false); return ReadFrameNum; } int CJkModbusDlg::WriteFrame(BYTE* ucharWriteFrame,BYTE WriteFrame[]) { UpdateData(); WriteFrame[0] = 0X01; ucharWriteFrame = WriteFrame; int WriteFrameNum = 0; BYTE bytSlaveAddress=m_bytSlaveAddress;//0X01; WriteFrame[WriteFrameNum ] = bytSlaveAddress;//从站地址 if(!m_nRead)bytComand = m_bytCommand;//0X02; WriteFrame[WriteFrameNum ] = bytComand;//功能码 // BYTE bytHightStartAddress=HIBYTE(m_dwStartAddress); // BYTE bytLowStartAddress=LOBYTE(m_dwStartAddress); // ReadFrame[ReadFrameNum ] = bytHightStartAddress;//开始地址 // ReadFrame[ReadFrameNum ] = bytLowStartAddress; WORD DataLenth=(WORD)MakeYXData(m_bytLocalYXData,m_nYXNum,m_bytDatas); // BYTE bytHightDataLenth=HIBYTE(m_dwDataLenth);//0X00; BYTE bytLowDataLenth=LOBYTE(DataLenth);//m_dwDataLenth);//0X01; // WriteFrame[WriteFrameNum ] = bytHightDataLenth; WriteFrame[WriteFrameNum ] = bytLowDataLenth;//数据长度 for (BYTE i=0; i<bytLowDataLenth; i ) { WriteFrame[WriteFrameNum ]=m_bytDatas[i]; } WORD CRC; CRC=GetCrc(WriteFrame,WriteFrameNum); BYTE bytLowCRC=LOBYTE(CRC); BYTE bytHightCRC= HIBYTE(CRC); WriteFrame[WriteFrameNum ] = bytLowCRC; WriteFrame[WriteFrameNum ] = bytHightCRC; ucharWriteFrame=&WriteFrame[0]; UpdateData(false); return WriteFrameNum; } /* -------------------------------------------------------- * 函数名称: MakeYXData * * 功能 : 构造有效遥信数据帧 * * 参数 : pData ---- 指向数据缓冲区 * * iYXNum ---- 遥信点的个数 * * pYXData ---- 指向转换后的数据缓冲区 * * 返回值 : 数据帧的字节数 * -------------------------------------------------------- */ int CJkModbusDlg::MakeYXData(BYTE* pData/*in*/, int iYXNum/*in*/, BYTE* pYXData/*out*/) { if((pData == NULL) && (pYXData == NULL)) { TRACE("The pointer don`t be initialized!\n"); return 0; } if (iYXNum/8 > 512) { TRACE("Beyond the range of whole YX`s number!\n"); return 0; } int iRmd = 0; int iQut = 0; pYXData[iYXNum/8 1] = 0x00; for(int i=0; i<iYXNum; i ) { iQut = i/8; iRmd= i%8 ; if( QueryYXState(pData,i) ) { //状态为合 switch (iRmd) { case 0: pYXData[iQut] |= 0x01; break; case 1: pYXData[iQut] |= 0x02; break; case 2: pYXData[iQut] |= 0x04; break; case 3: pYXData[iQut] |= 0x08; break; case 4: pYXData[iQut] |= 0x10; break; case 5: pYXData[iQut] |= 0x20; break; case 6: pYXData[iQut] |= 0x40; break; case 7: pYXData[iQut] |= 0x80; break; default: TRACE("Couter is WRONG!\n"); } } else { //状态为分 switch (iRmd) { case 0: pYXData[iQut] &= 0xfE; break; case 1: pYXData[iQut] &= 0xFD; break; case 2: pYXData[iQut] &= 0xFB; break; case 3: pYXData[iQut] &= 0xF7; break; case 4: pYXData[iQut] &= 0xEF; break; case 5: pYXData[iQut] &= 0xDF; break; case 6: pYXData[iQut] &= 0xBF; break; case 7: pYXData[iQut] &= 0x7F; break; default: TRACE("Couter is WRONG!\n"); } } } if((iYXNum-(iYXNum/8)*8) == 0) return (iYXNum/8); else return (iYXNum/8 1); } /* -------------------------------------------------------- * 函数名称: QueryYXState * * 功能 : 遥信状态查询 * * 参数 : pYXData ---- 指向遥信数据缓冲区 * * iYXID ---- 遥信点的序号 * * 返回值 : 遥信状态 * -------------------------------------------------------- */ BOOL CJkModbusDlg::QueryYXState(BYTE* pYXData, int iYXID) { if(pYXData == NULL) { TRACE("The pointer don`t be initialized!\n"); return FALSE; } if(pYXData[iYXID] == 0x01) return TRUE; if(pYXData[iYXID] == 0x00) return FALSE; return TRUE; } void CJkModbusDlg::SetYXState(BYTE* pYXData, int iYXID) { pYXData[iYXID]=m_bytStateValue; } WORD CJkModbusDlg::GetCrc(BYTE *DataFrame,int FrameNum) { WORD ret32; ret32=crc->getcrc((char *)&DataFrame[0],FrameNum); return ret32; } void CJkModbusDlg::OnProducemessage() //生成报文 { // TODO: Add your control notification handler code here UpdateData(TRUE); CString str; SYSTEMTIME tm; GetLocalTime(&tm); CString time; time.Format(_T("%2d日%02.2d:%2.2d"), tm.wDay,tm.wMinute, tm.wSecond); BYTE yxdata[1024]; BYTE* ucharYxData = yxdata; if(m_nYXNum != 0) { if(!m_nRead) { YxFrameNum= ReadFrame(ucharYxData,yxdata); for (int i=0; i<YxFrameNum; i ) { str.Format(str "%02X" " ",yxdata[i]); } str=time "读数据:" '\r' '\n' str '\r' '\n' "发送数据成功"; m_szSendView = m_szSendView str '\r' '\n' '\r' '\n'; } else { YxFrameNum= WriteFrame(ucharYxData,yxdata); for (int i=0; i<YxFrameNum; i ) { str.Format(str "%02X" " ",yxdata[i]); } str=time "写数据:" '\r' '\n' str '\r' '\n' "发送数据成功"; m_szSendView = m_szSendView str '\r' '\n' '\r' '\n' ; } } UpdateData(FALSE); m_edtSendView.LineScroll(m_edtSendView.GetLineCount());//使滚动条向下.注意m_szSendView累加时,放前和放后有区别. } void CJkModbusDlg::OnWritevalue() //单点设置状态 { // TODO: Add your control notification handler code here UpdateData(TRUE); SetYXState(m_bytLocalYXData,m_nIDNumber); UpdateData(FALSE); } void CJkModbusDlg::OnAlldispart() //状态全分 { // TODO: Add your control notification handler code here UpdateData(TRUE); for(int i=0;i<m_nYXNum;i ) { m_bytLocalYXData[i]=0X00; } UpdateData(FALSE); } void CJkModbusDlg::OnAllshut() //状态全合 { // TODO: Add your control notification handler code here UpdateData(TRUE); for(int i=0;i<m_nYXNum;i ) { m_bytLocalYXData[i]=0X01; } UpdateData(FALSE); } void CJkModbusDlg::OnClearsend() { // TODO: Add your control notification handler code here UpdateData(TRUE); m_szSendView.Empty(); UpdateData(FALSE); } void CJkModbusDlg::OnClearreceive() { // TODO: Add your control notification handler code here UpdateData(TRUE); m_szReceiveView.Empty(); UpdateData(FALSE); } void CJkModbusDlg::OnCommset() { // TODO: Add your command handler code here CDlgComSet DlgComSet; DlgComSet.m_szPort = m_Com->m_szPortName; CString br; br.Format("%d", m_Com->m_lBaudRate); DlgComSet.m_szBaud = br; CString jy; switch(m_Com->m_nParity) { case ODDPARITY: jy = "奇校验"; break; case EVENPARITY: jy = "偶校验"; break; default: jy = "无校验"; break; } DlgComSet.m_szParity = jy; if(DlgComSet.DoModal() == IDOK) { m_Com->m_szPortName = DlgComSet.m_szPort; m_Com->m_lBaudRate = atol(DlgComSet.m_szBaud); jy = DlgComSet.m_szParity; if(jy == "奇校验") m_Com->m_nParity = ODDPARITY; else if(jy == "偶校验") m_Com->m_nParity = EVENPARITY; else m_Com->m_nParity = NOPARITY; /* if(m_Com != INVALID_HANDLE_VALUE)//设置串口后直接打开串口 { m_Com->ClosePort(); Sleep(10); // I don't know reason,if don't do this,OpenPort may fail m_Com->OpenPort(); } */ } } void CJkModbusDlg::OnCommopen() { // TODO: Add your command handler code here m_Com->OpenPort(); if(!m_Com->PortOpened()) { AfxMessageBox("不能打开通信口" m_Com->m_szPortName); return; } m_Com->SetThreshold(1); } void CJkModbusDlg::OnCommclose() { // TODO: Add your command handler code here m_Com->ClosePort(); if(m_chkContinualSend) { KillTimer(ID_SEND); } } void CJkModbusDlg::OnSenddata() { // TODO: Add your control notification handler code here if (!m_Com->PortOpened()) { AfxMessageBox("通讯串口没有打开!"); return; } BYTE yxdata[1024]; BYTE* ucharYxData = yxdata; if(!m_nRead) { YxFrameNum= ReadFrame(ucharYxData,yxdata); } else{ YxFrameNum= WriteFrame(ucharYxData,yxdata); } m_bSendok = m_Com->Send((BYTE*)(ucharYxData), YxFrameNum); if(m_bSendok)OnProducemessage(); } void CJkModbusDlg::OnUpdateCommopen(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here UpdateData(TRUE); pCmdUI->Enable(!m_Com->PortOpened()); pCmdUI->SetCheck(1); UpdateData(FALSE); } void CJkModbusDlg::OnUpdateCommclose(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here UpdateData(TRUE); pCmdUI->Enable(m_Com->PortOpened()); UpdateData(FALSE); /* //是否在 显示在所有窗口最前端 菜单项打上标记 if(m_bAlwaysTop) { pMenu->CheckMenuItem( IDC_ALWAYSTOP,MF_CHECKED); } else { pMenu->CheckMenuItem( IDC_ALWAYSTOP,MF_UNCHECKED); } */ } void CJkModbusDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default OnSenddata(); CDialog::OnTimer(nIDEvent); } void CJkModbusDlg::OnContinuesend() { // TODO: Add your control notification handler code here UpdateData(true); if(m_chkContinualSend) { SetTimer(ID_SEND, m_dwInterval, NULL); } else { m_nSendTimes = 0; UpdateData(false); KillTimer(ID_SEND); } } LRESULT CJkModbusDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class if(message == WM_COM) { if(wParam != COM_THRESHOLD) { if(wParam == 5) { int m_xx=0; m_xx ; // char buf[10]; // SetDlgItemText(IDC_EDIT1, itoa(m_xx, buf, 10)); } return 0; } bool m_bRvSucced; BYTE buff[2048]; // BYTE receive[2048]; DWORD dwReaded=0; if(!m_nRead) { m_bRvSucced = m_Com->Receive(buff, 1024, dwReaded);//接收数据的长度dwReaded buff[dwReaded] = '\0'; ReceiveDataDeal_write(buff, dwReaded); char ShowValue[2]; for(DWORD i=0; i<dwReaded; i ) { wsprintf(ShowValue, "%02X", buff[i]);//取两位十六进制方式数据 m_szReceiveView = ShowValue; m_szReceiveView = 0X20;//接收数据间的空格 if(i%8 == 0 && i>0) { m_szReceiveView = m_szReceiveView "\r\n"; } } } else { m_bRvSucced = m_Com->Receive(buff, 8, dwReaded);//接收数据的长度dwReaded buff[dwReaded] = '\0'; ReceiveDataDeal_read(buff, dwReaded); char ShowValue[2]; for(DWORD i=0; i<dwReaded; i ) { wsprintf(ShowValue, "%02X", buff[i]);//取两位十六进制方式数据 m_szReceiveView = ShowValue; m_szReceiveView = 0X20;//接收数据间的空格 } if(dwReaded != 0)m_szReceiveView = m_szReceiveView "\r\n"; } if((UINT)m_szReceiveView.GetLength() >= 1024) { m_szReceiveView = ""; UpdateData(false); } SetDlgItemText(IDC_RECEIVEVIEW, m_szReceiveView);//显示接收的数据 // UpdateData(false); m_Com->SetThreshold(1); return true; } else { return CDialog::WindowProc(message, wParam, lParam); } } void CJkModbusDlg::ReceiveDataDeal_write(BYTE receive[], DWORD r) { } void CJkModbusDlg::ReceiveDataDeal_read(BYTE receive[], DWORD r) { WORD CRC; int DataLength; DataLength=(int)r-2; CRC=GetCrc(receive,DataLength); BYTE bytLowCRC = LOBYTE(CRC); BYTE bytHightCRC = HIBYTE(CRC); CString str="",StrValue=""; str.Format(str "%02X",bytLowCRC); str.Format(str " %02X",bytHightCRC); if(receive[0] == m_bytSlaveAddress) { if(receive[1] == 0x05)return; bytComand = receive[1]; // if(receive[6] == bytLowCRC && receive[7]==bytHightCRC) // { BYTE yxdata[1024]; BYTE* ucharYxData = yxdata; YxFrameNum= WriteFrame(ucharYxData,yxdata); m_bSendok = m_Com->Send((BYTE*)(ucharYxData), YxFrameNum); if(m_bSendok)OnProducemessage(); // } // else // { // StrValue.Format(StrValue "%02x",receive[6]); // StrValue.Format(StrValue " %02X",receive[7]); // m_szReceiveView = m_szReceiveView "\r\n" "CRC校验码错误:应该为" str " 接收为:" StrValue "\r\n"; // UpdateData(false); // } } }