mfc下的串口通信有哪位高手懂.需.
mfc下的串口通信有谁懂..急需求助..
qq 806741321
------解决方案--------------------
http://blog.sina.com.cn/s/blog_43e57e8a0100dryq.html
找个串口编程的先看看
------解决方案--------------------
串口的话,主要是涉及到对串口的设置,以及发送的命令
------解决方案--------------------
首先 建议不要在初始化里打开串口 你先是初始化设置串口未关闭状态 马上又判断没打开就打开串口,这还不是等于在初始化里打开了串口,建议做到事件响应里去
发送函数我是这样做的:
TRY
{
m_com.SetOutput((COleVariant)(LPCTSTR)cstr);
}
CATCH (CMemoryException, e)
{
TCHAR tchr[1024]={0};
e->GetErrorMessage(tchr,1024);
MessageBox(tchr,_T("串口错误"), MB_OK | MB_ICONERROR);
}
END_CATCH
至于接收数据 我没像你那样自己写
/*<<-- 收到数据事件 -->>*/
if(m_com.GetCommEvent()==02)
{
/*<<-- 获得串口数据 -->>*/
m_vt = m_com.GetInput();
/*<<-- 组合接收字符串 -->>*/
m_recv += (CString)m_vt.bstrVal;
/*<<-- 输出数据到界面 -->>*/
UpdateData(false);
}
看看对你有用不
------解决方案--------------------
if(!m_cComm.GetPortOpen())
{
m_cComm.SetPortOpen(TRUE); //打开串口
m_cComm.SetRThreshold(1); //每当接收缓冲区有1个字符则接收串口数据
m_cComm.SetInputLen(0); //设置当前缓冲区长度为0
m_cComm.GetInput(); //预读缓冲区以清除残留数据
}
else
AfxMessageBox("打开端口失败!",MB_ICONSTOP,0);
改成这样,看看到底打没打开串口:
m_cComm.SetPortOpen(TRUE); //打开串口
m_cComm.SetRThreshold(1); //每当接收缓冲区有1个字符则接收串口数据
m_cComm.SetInputLen(0); //设置当前缓冲区长度为0
m_cComm.GetInput(); //预读缓冲区以清除残留数据
if(!m_cComm.GetPortOpen())
{
AfxMessageBox("打开端口失败!",MB_ICONSTOP,0);
}
------解决方案--------------------
你的串口映射对么。所有设置对么。你要查下目标机串口通讯的协议之类的
------解决方案--------------------
SerialPort 类,一个外国人写得类,在****下载中心有得下载
------解决方案--------------------
OnCheckAutosend,这个函数里刚打开定时器就又关了.所以不可能进入定时器中断函数.另外,你这么开定时器:
m_TimeHandle=SetTimer(1,i,NULL);//i不能小于100毫秒
在OnTimer(UINT nIDEvent)
{
if(nIDEvent==m_TimeHandle)
{
Onguanbichuankou4();//自动调用的函数
}
}
------解决方案--------------------
你应该检查一下你打开的串口号有没有被MODEM或其他设备占用
如果占用的话,你就打不开了
qq 806741321
------解决方案--------------------
http://blog.sina.com.cn/s/blog_43e57e8a0100dryq.html
找个串口编程的先看看
------解决方案--------------------
串口的话,主要是涉及到对串口的设置,以及发送的命令
------解决方案--------------------
首先 建议不要在初始化里打开串口 你先是初始化设置串口未关闭状态 马上又判断没打开就打开串口,这还不是等于在初始化里打开了串口,建议做到事件响应里去
发送函数我是这样做的:
TRY
{
m_com.SetOutput((COleVariant)(LPCTSTR)cstr);
}
CATCH (CMemoryException, e)
{
TCHAR tchr[1024]={0};
e->GetErrorMessage(tchr,1024);
MessageBox(tchr,_T("串口错误"), MB_OK | MB_ICONERROR);
}
END_CATCH
至于接收数据 我没像你那样自己写
/*<<-- 收到数据事件 -->>*/
if(m_com.GetCommEvent()==02)
{
/*<<-- 获得串口数据 -->>*/
m_vt = m_com.GetInput();
/*<<-- 组合接收字符串 -->>*/
m_recv += (CString)m_vt.bstrVal;
/*<<-- 输出数据到界面 -->>*/
UpdateData(false);
}
看看对你有用不
------解决方案--------------------
if(!m_cComm.GetPortOpen())
{
m_cComm.SetPortOpen(TRUE); //打开串口
m_cComm.SetRThreshold(1); //每当接收缓冲区有1个字符则接收串口数据
m_cComm.SetInputLen(0); //设置当前缓冲区长度为0
m_cComm.GetInput(); //预读缓冲区以清除残留数据
}
else
AfxMessageBox("打开端口失败!",MB_ICONSTOP,0);
改成这样,看看到底打没打开串口:
m_cComm.SetPortOpen(TRUE); //打开串口
m_cComm.SetRThreshold(1); //每当接收缓冲区有1个字符则接收串口数据
m_cComm.SetInputLen(0); //设置当前缓冲区长度为0
m_cComm.GetInput(); //预读缓冲区以清除残留数据
if(!m_cComm.GetPortOpen())
{
AfxMessageBox("打开端口失败!",MB_ICONSTOP,0);
}
------解决方案--------------------
你的串口映射对么。所有设置对么。你要查下目标机串口通讯的协议之类的
------解决方案--------------------
SerialPort 类,一个外国人写得类,在****下载中心有得下载
------解决方案--------------------
OnCheckAutosend,这个函数里刚打开定时器就又关了.所以不可能进入定时器中断函数.另外,你这么开定时器:
m_TimeHandle=SetTimer(1,i,NULL);//i不能小于100毫秒
在OnTimer(UINT nIDEvent)
{
if(nIDEvent==m_TimeHandle)
{
Onguanbichuankou4();//自动调用的函数
}
}
------解决方案--------------------
你应该检查一下你打开的串口号有没有被MODEM或其他设备占用
如果占用的话,你就打不开了