串口通信serialport类使用,急!

dzg924 2004-01-15 09:54:02

我在编数据实时采集程序时,串口通信程序使用了serialport类,我的程序是对四台欧姆龙PLC操作,它们的地址分别是00,01,02,03,如果四台PLC通信都正常时没有问题,但其中有一台PLC出问题时串口就不能通信了。(我想先和第一台PLC通信,如果能通信则,则向下一台通信,关键是如果不能通信,那怎样使他能向下一台PLC通信呢?,其他也一样,这是我的想法,但不知道怎么解决。)
下面是我的原代码,请帮我。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
/////////////////串口命令
if(!m_Port.InitPort(this,1,9600,E,7,2,EV_RXFLAG | EV_RXCHAR,512
{
CString str;
str.Format("COM%d 没有发现,或被其它设备占",setupstate.com_number);
AfxMessageBox(str);
return 0;
}
m_Port.StartMonitoring();
SetTimer(1,1000, NULL);//实时采集时间
SetTimer(2,100000,NULL);//向数据库写运行历史数据
SetTimer(5,1000,NULL);///弹出报警窗口时间

CString senddata;
senddata = _T("@01RD00200507");
CodeArray(senddata);
m_SendArray[0] = senddata;

senddata = _T("@01RR02000015");
CodeArray(senddata);
m_SendArray[1] = senddata;

senddata = _T("@02RD00200507");
CodeArray(senddata);
m_SendArray[2] = senddata;

senddata = _T("@02RR02000015");
CodeArray(senddata);
m_SendArray[3] = senddata;

senddata = _T("@03RD00200507");
CodeArray(senddata);
m_SendArray[4] = senddata;

senddata = _T("@03RR02000015");
CodeArray(senddata);
m_SendArray[5] = senddata;

senddata = _T("@00RD00400354");
CodeArray(senddata);
m_SendArray[6] = senddata;

senddata = _T("@00RD07000941");
CodeArray(senddata);
m_SendArray[7] = senddata;

senddata = _T("@00RR01000233");
CodeArray(senddata);
m_SendArray[8] = senddata;

senddata = _T("@00HR00120008");
CodeArray(senddata);
m_SendArray[9] = senddata;

if (ReadOk_Event != NULL)
ResetEvent(ReadOk_Event);
ReadOk_Event = CreateEvent(NULL, FALSE, FALSE, NULL);

if (Collection_Event != NULL)
ResetEvent(Collection_Event);
Collection_Event = CreateEvent(NULL, FALSE, FALSE, NULL);

ComThreadArray[0] = Collection_Event;
ComThreadArray[1] = ReadOk_Event;

if (!AfxBeginThread(WatchProc, this))
AfxMessageBox("the com send thread create fail");
TRACE("Thread started\n");

return 0;
}

LONG CMainFrame::OnCommunication(WPARAM wParam, LPARAM lPARAM)
{
if((char)wParam == '@')
{
m_receive_message = "";
m_receive_fcs = 0;
enable_receive_flag =true;
}
if(enable_receive_flag)
{
if((char)wParam != 0x0D)
{
m_receive_message += (char)wParam;
}
else
{
enable_receive_flag =false;
if(m_receive_message[5] == '0' && m_receive_message[6] == '0')
{
int data_count = m_receive_message.GetLength() - 3;
for(int i =0; i<data_count;i++)
{
m_receive_fcs ^=m_receive_message[i];
}
char fcs_data1,fcs_data2;
int buff_data;
buff_data = m_receive_fcs >> 4;
fcs_data1 = IntToAsci((BYTE)buff_data);
buff_data = m_receive_fcs & 0x0F;
fcs_data2 = IntToAsci((BYTE)buff_data);
if(fcs_data1 == m_receive_message[data_count] &&
fcs_data2 == m_receive_message[data_count +1])
{
if(m_receive_message[3] =='W')
{
if((m_receive_message[4] =='D') | (m_receive_message[4]=='R'))
send_answer_flag = true;
return 0;
}
else
SetEvent(ReadOk_Event);
// Expressdata(message_socket);
}
else
;
}
else
;// //识别码出错
}
}
return 0;
}

void CMainFrame::Expressdata(CString &sockdata_string)
{
CTime time;
if(readcount==10)
{
data_group = sockdata_string.Mid(1*4,4);
data_group1 = sockdata_string.Mid(2*4,4);
m_strlqBeng1 = sockdata_string.Mid(6*4,4);
m_strlqBeng2 = sockdata_string.Mid(7*4,4);
m_strFaults=sockdata_string.Mid(8*4,4);

receive_array=sockdata_string.Mid(35*4,4);
m_nFaults=atoi(m_strFaults);
m_nlqBeng1=atoi(m_strlqBeng1);
m_nlqBeng2=atoi(m_strlqBeng2);
}
//取位
int j;
for(j=0;j<16;j++){
faults1[j]=((int)(m_nFaults/pow(2,j)))&1;
}
switch(faults1[1])
{
case 0:
KillTimer(3);
KillTimer(4);
time=CTime::GetCurrentTime();
m_strHuifuTime=time.Format("%H:%M:%S");
break;
case 1:
SetTimer(3,1000,NULL);
SetTimer(4,1000,NULL);
time=CTime::GetCurrentTime();
m_strCurTime=time.Format("%H:%M:%S");
break;
}

}

void CMainFrame::CodeArray(CString &SendString)
{
CString bbk;
BYTE fcs = 0 ;
bbk = SendString;
for(int i =0; i < bbk.GetLength(); i++)
fcs ^= bbk[i];
bbk += IntToAsci(fcs >> 4);
bbk += IntToAsci(fcs & 0x0f);
bbk += "*\r";
SendString = bbk;
}

char CMainFrame::IntToAsci(BYTE changedata)
{
if(changedata >= 0 && changedata <= 9)
return(48 + changedata);
else if(changedata >=10 && changedata <=15)
return(55 + changedata);
else
return 0;
}

UINT CMainFrame::WatchProc(LPVOID param)
{
CMainFrame* parent = (CMainFrame*)param;
DWORD Event = 0;
// int readcount =0;
char szCmd[17];
while(true)
{
Event = WaitForMultipleObjects(2, parent->ComThreadArray, FALSE, INFINITE);
switch(Event)
{
case 0:
parent->message_backup = ""; //重新开始采集
readcount = 0;
sprintf(szCmd, parent->m_SendArray[readcount]);
parent->m_Port.WriteToPort(szCmd);
break;
case 1 : //读到有效的一组数据
int data_count =parent->m_receive_message.GetLength();
if(data_count < 13)
break;
CString getbuff =parent->m_receive_message.Mid(7,data_count - 10);
parent->message_backup +=getbuff;
readcount++;
if(readcount >=1 && readcount <=9)
{
sprintf(szCmd, parent->m_SendArray[readcount]);
parent->m_Port.WriteToPort(szCmd);
}
if(readcount ==10)
{
parent->message_socket = parent->message_backup;
if(parent->message_backup.GetLength() != 3102 * 4)
break;
parent->Expressdata(parent->message_socket);
}
break;
}
}
return false;
}

void CMainFrame::OnTimer(UINT nIDEvent)
{
switch(nIDEvent){
case 1:
SetEvent(Collection_Event);
UpdateData(false);
break;
case 2:
break;
case 3:
break;
default:
break;
}
CFrameWnd::OnTimer(nIDEvent);
}
...全文
405 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧