我在使用MSComm类进行串口编程的时候,编译通过。使用“串口调试助手v2.1”发送数据,但是程序收不到,而且发送数据的时候总会出现“属性只读”的异常!有谁能告诉我这个“属性只读”的异常是怎么产生的?我应该怎么解决?请各位大侠指点小弟,特别感谢了!关键代码如下:大概意思是从串口取得单片机送来的温度值,然后现实在Edit里;并且把Edit中输入的温度域值送往串口的单片机。BOOL CMy2COMDlg::OnInitDialog()
{
………………
m_wnd_2_COM1.SetPortOpen(3);
m_wnd_2_COM1.SetSettings("1200,n,8,1");//波特率1200,无校验,8个数据位,1个停止位
m_wnd_2_COM1.SetInputMode(1); //1:表示以二进制方式检取数据
m_wnd_2_COM1.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将 //引发一个接收数据的OnComm事件
m_wnd_2_COM1.SetInputLen(1); //每接收1个字符就引发onCom事件
if(!m_wnd_2_COM1.GetPortOpen())
m_wnd_2_COM1.SetPortOpen(TRUE); //打开端口
m_wnd_2_COM1.GetInput(); //先预读缓冲区以清除残留数据
m_wnd_2_COM1.SetCTSHolding(TRUE);
m_wnd_2_COM1.SetCDHolding(FALSE);
m_wnd_2_COM1.SetDSRHolding(FALSE);………………
}
void CMy2COMDlg::OnCommMscomm1()
{
// TODO: Add your control notification handler code here
switch(m_ctrlComm.GetCommEvent())
{
case 1: //comEvSend发送事件
m_ctrlComm.SetOutput(COleVariant("t"));
m_ctrlComm.SetOutput(COleVariant(m_tem_top));
m_ctrlComm.SetOutput(COleVariant("b"));
m_ctrlComm.SetOutput(COleVariant(m_tem_bottom));
break; case 2: //comEvReseiv接收事件
VARIANT tempR;
int k;
k=m_ctrlComm.GetInputLen();
if(k>0)
{
tempR = m_ctrlComm.GetInput();
m_recent_tem = tempR.bVal; //把接收到的数据经转换格式后赋给编辑框的变量??????? if(m_recent_tem<m_tem_bottom||m_recent_tem>m_tem_top) //发送报警信号
{
m_ctrlComm.SetOutput(COleVariant("a"));
} CMy2COMDlg::OnChangeRec(); //显示当前温度
} break; case 1009: //comEventRxity奇偶校验错误事件 break; default:
break;
}
}void CMy2COMDlg::OnSendLimitLine() // 发送预设的温度上下限
{
CMy2COMDlg::OnSetTop();
CMy2COMDlg::OnSetBottom();
m_wnd_2_COM1.SetCommEvent(1);
CMy2COMDlg::OnCommMscomm1();
}
{
………………
m_wnd_2_COM1.SetPortOpen(3);
m_wnd_2_COM1.SetSettings("1200,n,8,1");//波特率1200,无校验,8个数据位,1个停止位
m_wnd_2_COM1.SetInputMode(1); //1:表示以二进制方式检取数据
m_wnd_2_COM1.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将 //引发一个接收数据的OnComm事件
m_wnd_2_COM1.SetInputLen(1); //每接收1个字符就引发onCom事件
if(!m_wnd_2_COM1.GetPortOpen())
m_wnd_2_COM1.SetPortOpen(TRUE); //打开端口
m_wnd_2_COM1.GetInput(); //先预读缓冲区以清除残留数据
m_wnd_2_COM1.SetCTSHolding(TRUE);
m_wnd_2_COM1.SetCDHolding(FALSE);
m_wnd_2_COM1.SetDSRHolding(FALSE);………………
}
void CMy2COMDlg::OnCommMscomm1()
{
// TODO: Add your control notification handler code here
switch(m_ctrlComm.GetCommEvent())
{
case 1: //comEvSend发送事件
m_ctrlComm.SetOutput(COleVariant("t"));
m_ctrlComm.SetOutput(COleVariant(m_tem_top));
m_ctrlComm.SetOutput(COleVariant("b"));
m_ctrlComm.SetOutput(COleVariant(m_tem_bottom));
break; case 2: //comEvReseiv接收事件
VARIANT tempR;
int k;
k=m_ctrlComm.GetInputLen();
if(k>0)
{
tempR = m_ctrlComm.GetInput();
m_recent_tem = tempR.bVal; //把接收到的数据经转换格式后赋给编辑框的变量??????? if(m_recent_tem<m_tem_bottom||m_recent_tem>m_tem_top) //发送报警信号
{
m_ctrlComm.SetOutput(COleVariant("a"));
} CMy2COMDlg::OnChangeRec(); //显示当前温度
} break; case 1009: //comEventRxity奇偶校验错误事件 break; default:
break;
}
}void CMy2COMDlg::OnSendLimitLine() // 发送预设的温度上下限
{
CMy2COMDlg::OnSetTop();
CMy2COMDlg::OnSetBottom();
m_wnd_2_COM1.SetCommEvent(1);
CMy2COMDlg::OnCommMscomm1();
}
解决方案 »
- VC工程的字符集选择ASCII或者MBCS,中文都显示乱码,为什么?
- 求 UNICODE 转 urlencode ?
- recordset的open方法和connection的execute方法的区别?
- 奇怪了,我的程序在2000下只有一个进程,跑到XP(SP1)下却成有两个进程了?另外一个只有几百K。
- 怎么使鼠标超出窗体时,OnMouseMove继续捕捉鼠标的坐标?
- 急,急,怎么在windows程序中得到CPU主频??
- 请sxbyl (山野白菜) 来拿分。
- 菜鸟的问题!!
- 老难题,ocx如何获取IE关闭的消息
- 用GetDIBits获取8位图像素点怎么获取不了!!求大神给代码
- 我想用VC制作五子棋这样的小游戏。请各位大侠帮帮忙!
- 如何编程实现计算网络传输的误码率?
另外,你这样写的在GetInput()的时候会有内存泄露,请参看这篇文章
http://book.77169.org/data/web5005/20050227/20050227__3743154.html
请指教。
这个问题我还没遇到过,也不清楚,建议你去龚老大的主页去学习下吧(上面的链接就是)
我也有一些关于串口的项目,希望能交个朋友,以后多交流,我的邮箱,[email protected]
(问题解决了记得告诉我哦)