找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6109|回复: 0
打印 上一主题 下一主题
收起左侧

在使用SerialPort类做串口编程时 遇到的问题收集

[复制链接]
跳转到指定楼层
楼主
ID:60266 发表于 2014-8-18 02:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                        1:【转】SerialPort收数据时调试时 出现的comstat未初始化
Run-Time Check Failure #3 - The variable 'comstat' is beingused without being initialized.

CSerialPort类在Visual C++ .NET 应用时会出现意想不到的问题。以《Visual C++/TuroboC串口通信编程实践》(龚建伟 熊光明 著)一书中第二章的SerialPortTest程序为例,当在Visual C++.NET下编写后之后,debug之后,会出现编译错误:“operator+="不明确,MSDN解释“为重载运算符定
义了多个可能的运算符。可能的解决方案:对一个或多个实际参数使用显式转换。”当将


LONG CSerialPortTestDlg::OnComm(WPARAM ch, LPARAM port)
{
m_strEditReceiveMsg +=ch;
UpdateData(FALSE); //将接收到的字符显示在接收编辑框中
return 0;
}


中m_strEditReceiveMsg +=ch;改写为m_strEditReceiveMsg+=char(ch);后,debug顺利通过了。其实这个还不是CSerialPort类的问题。m_strEditReceiveMsg+=ch;改写为m_strEditReceiveMsg+=char(ch) 是应该的,这样更为严谨,因为在 OnComm(WPARAM ch, LPARAM port)函数中,ch 为WPARAM型数据,WPARAM型数据适应型很强,char(ch)将ch强制转换为char型,更适合CString型,这应该算是VC.NET的进步。


   当将这个问题解决之后,编译成功了。然后开始测试。向串口调试助手发送消息时一切正常。但从串口调试助手向SerialPortTest发送消息时,报错了,说“comstatis being used withoutdefining",在SerialPort.CPP中,可以找到comstat的定义:COMSTAT comstat;但将光标指向comstat时右键转到定义处或声明处,却均提示“未定义符号”,这便是CSerialPort类在VC.NET应用中的问题了。那该如何解决这个问题呢?在这,我们向大家提供两种解决方案:


方案1: 改变项目配置属性


   一种解决方案是改变基本运行时检查(changing the runtime checks in projectsettings):在菜单Project->Projectproperties-> C/C++ -> Codegeneration-> Basic Runtime checks -->change to'Default',在中文版中是:项目-〉属性-〉配置属性-〉C/C++代码生成-〉基本运行时检查-〉设置为默认,当将基本运行时检查改为默认之后,编译自然顺利通过了,向串口调试助手发送消息正常了,再从串口调试助手向SerialPortTest发送消息时,也正常了。


方案2:改变comstat变量属性


    另一种解决方案是将CSerialPort.CPP中的COMSTATcomstat;改为static COMSTATcomstat;这样改了之后,debug顺利通过,然后调试,与串口调试助手相互发消息都OK了。为什么这样就能解决呢?其实当你使用debug解决方案时,它的基本运行时检查初始设置为:两者(/RTC1,等同于/RTCsu),这个两者是指:堆栈帧(/RTCs),未初始化的变量(/RTCu)。由于它要检查未初始化的变量,所以将SerialPort.cpp中的COMSTATcomstat;改为static COMSTAT comstat;就可以正常使用CSerialPort类了。
    以上是在debug下的解决方案,当在Release编译状态时,你会发现并不需要将COMSTATcomstat;改为static COMSTATcomstat;就能编译成功并且发送接收消息正常。其实,在Release下,它的基本运行时检查初始设置已为默认。这应该也算是第一种解决方案之内。
    而当你将它设置为两者(/RTC1,等同于/RTCsu)时,不论是否将COMSTAT comstat;改为static COMSTATcomstat;,编译都不能通过,报错““cl.exe”返回的结果有误。",这个应该是属于Release的问题了,另当别论了。
   CSerialPort类是一个用起来很方便的类,在VisualC++.NET应用时,遇到一些问题,上面是解决方案是否妥当,请大家也去试试,说不定有更好的解决方案。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表