串口操作碰到的问题:

kingcaiyao 2003-10-16 03:54:39
最近用VC写了一个串口小程序,将串口写成一个类,然后动态生成一个类的实例,以此类的实例作为类的全局变量在整个程序中以此来操作串口,我的程序需要不断监听串口(即读串口),所以程序开始我就在主窗体中开辟一线程或一定时器来不断地读串口,当读到的数据为空时则不处理,不为空则转到相应的处理。同时我在子窗口中需要对串口进行写操作,这个程序本来没有什么问题,但最近我发现,如果在子窗体中不断地对串口进行写操作,也就是说间隔时间非常短,比如说在一按钮的单击来写串口,当我快速地,不断地,重复地按这个按钮来写串口,这时就会出现错误,提示内存越界错误。我起初怀疑我的读写超时错误,后来我将读写超时均设置成最大值即0XFFFFFFFF。我的串口都是以重叠方式进行操作的,读操作和写操作分别用两个不同的overlapped来进行操作,但当我快速地写串口时,仍然会报ACCESS VIOLATION错误,。我在主程序中通过监听EV_RXCHAR事件来获得从串口收到的数据。我试过在出现错误后,我将主窗体中监听串口的线程关闭掉,然后再快速地写串口,此时又没有问题。于是我怀疑读写串口同步时可能发生问题,但我已经在串口类中以重叠方式对串口进行操作,应该没有问题,希望各位讨论.
其主要错误提示为:
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC00000FD: Stack Overflow.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MFC42D.DLL): 0xC0000005: Access Violation.
First-chance exception in SmartPhone.exe (MSVCRTD.DLL): 0xC0000005: Access Violation.
memory check error at 0x017BAFEF = 0x4F, should be 0xFD.
memory check error at 0x017BAFF0 = 0x4E, should be 0xFD.
memory check error at 0x017BAFF1 = 0x45, should be 0xFD.
memory check error at 0x017BAFF2 = 0x3A, should be 0xFD.
...全文
93 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
duyhui 2003-10-17
  • 打赏
  • 举报
回复
既然你已经用通过监听EV_RXCHAR事件来获得从串口收到的数据,那为什么还要设个定时期呢?
而且,正常的程序不需要::Sleep(10);啊!
还有,不需要用循环while(1)是不行的



kingcaiyao 2003-10-16
  • 打赏
  • 举报
回复
很简单:
while(1){
if (!::WaitCommEvent(m_CommPort->GetHandle(), &EvtMask, &os))
{
if ((EvtMask | EV_RXCHAR)==EV_RXCHAR)
{
m_strTemp+=m_CommPort->Read();
::Sleep(10);
m_strTemp+=m_CommPort->Read();
if(m_strTemp.IsEmpty()) return;
TRACE("%s\r\n",m_strTemp);
//另作处理
.....................
......................................
...................................
}
}
}
windlrming 2003-10-16
  • 打赏
  • 举报
回复
能不能把哪线程的源码贴出来
kingcaiyao 2003-10-16
  • 打赏
  • 举报
回复
呵呵,不会吧,这么大的论坛,没有一个给出点建设性的意见吗?
请大家讨论讨论。
kingcaiyao 2003-10-16
  • 打赏
  • 举报
回复
我的读和写并不没有用一个缓冲区
crystal_heart 2003-10-16
  • 打赏
  • 举报
回复
up
FlyYang 2003-10-16
  • 打赏
  • 举报
回复
串口是全双工的,读和写不应该有问题
读和写的缓冲最好不要用同一个

---------
++C++
---------
软件介绍: 泰康串口大师是一款在Windows平台下通过串口接收发送数据的工具软件。采 用多线程设计,使得软件操作性能更佳。 泰康串口大师在启动后能够自动检测并列出所有存在的COM接口,能够记录数 据到达时间(毫秒ms级),支持以16进制和字符两种方式接收、发送、保存数据并且 具有循环发送数据的功能。另外,支持ASCII码与字符之间自动转换。 特点: 在实际工程中,经常会碰到这样的问题,那就是需要检测设备通过串口发送数 据的速度。为解决这个问题,在泰康串口大师中设计并实现了记录数据到达时间 (毫秒ms级)的功能。 另外,在泰康串口大师中还设计和实现了根据1个字符的16进制ASCII数值添加 时间戳的功能,即当接收到设定字符时记录收到该字符的时间(毫秒ms级)。目的 是能够方便地检测两条已收到的完整记录之间的时间间隔。 操作方法: 简单的发送接收数据的方法与大多数串口助手软件类似,此处不再赘述。 需要特殊说明的是,当使用根据字符插入时间戳的功能时,要注意: 1.当且仅当在接收设置区域同时选择“加入时间戳”和“十六进制显示”时,才能够激 活记录数据到达时间功能。 2.目前只支持根据1个字符的16进制ASCII数值添加时间戳。 3.如果本功能启用后没有在对应的编辑框中写入数据,那么软件会默认在收到的数 据中查找00,并在其前面添加时间戳。 4.如果收到的数据中没有已设定的字符,按么软件不会添加时间戳。 声明: 泰康串口大师由Techcon泰康提供的免费软件,目的是为广大工控领域以及其 他领域的工程师在实际工作中提供方便。如果在使用过程中发现泰康串口大师有 什么问题以及建议,欢迎各位发送邮件huxiaowei@thtf.com.cn提出反馈信息。 我们有专门的软件工程师接收并处理反馈信息,您的意见和建议必将为更多的工 程师在实际工作中带来更多的便利。
软件介绍: 泰康串口大师是一款在Windows平台下通过串口接收发送数据的工具软件。采 用多线程设计,使得软件操作性能更佳。 泰康串口大师在启动后能够自动检测并列出所有存在的COM接口,能够记录数 据到达时间(毫秒ms级),支持以16进制和字符两种方式接收、发送、保存数据并且 具有循环发送数据的功能。另外,支持ASCII码与字符之间自动转换。 特点: 在实际工程中,经常会碰到这样的问题,那就是需要检测设备通过串口发送数 据的速度。为解决这个问题,在泰康串口大师中设计并实现了记录数据到达时间 (毫秒ms级)的功能。 另外,在泰康串口大师中还设计和实现了根据1个字符的16进制ASCII数值添加 时间戳的功能,即当接收到设定字符时记录收到该字符的时间(毫秒ms级)。目的 是能够方便地检测两条已收到的完整记录之间的时间间隔。 操作方法: 简单的发送接收数据的方法与大多数串口助手软件类似,此处不再赘述。 需要特殊说明的是,当使用根据字符插入时间戳的功能时,要注意: 1.当且仅当在接收设置区域同时选择“加入时间戳”和“十六进制显示”时,才能够激 活记录数据到达时间功能。 2.目前只支持根据1个字符的16进制ASCII数值添加时间戳。 3.如果本功能启用后没有在对应的编辑框中写入数据,那么软件会默认在收到的数 据中查找00,并在其前面添加时间戳。 4.如果收到的数据中没有已设定的字符,按么软件不会添加时间戳。
泰康串口大师是一款在Windows平台下通过串口接收发送数据的工具软件。采 用多线程设计,使得软件操作性能更佳。 泰康串口大师在启动后能够自动检测并列出所有存在的COM接口,能够记录数 据到达时间(毫秒ms级),支持以16进制和字符两种方式接收、发送、保存数据并且 具有循环发送数据的功能。另外,支持ASCII码与字符之间自动转换。 特点: 在实际工程中,经常会碰到这样的问题,那就是需要检测设备通过串口发送数 据的速度。为解决这个问题,在泰康串口大师中设计并实现了记录数据到达时间 (毫秒ms级)的功能。 另外,在泰康串口大师中还设计和实现了根据1个字符的16进制ASCII数值添加 时间戳的功能,即当接收到设定字符时记录收到该字符的时间(毫秒ms级)。目的 是能够方便地检测两条已收到的完整记录之间的时间间隔。 操作方法: 简单的发送接收数据的方法与大多数串口助手软件类似,此处不再赘述。 需要特殊说明的是,当使用根据字符插入时间戳的功能时,要注意: 1.当且仅当在接收设置区域同时选择“加入时间戳”和“十六进制显示”时,才能够激 活记录数据到达时间功能。 2.目前只支持根据1个字符的16进制ASCII数值添加时间戳。 3.如果本功能启用后没有在对应的编辑框中写入数据,那么软件会默认在收到的数 据中查找00,并在其前面添加时间戳。 4.如果收到的数据中没有已设定的字符,按么软件不会添加时间戳。 当使用插件架构的功能时,要注意: 1.脚本存放目录为主程序当前目录的plugin文件夹。 2.脚本命名目前只支持非Unicode字符串,不支持中文名。 3.对于脚本的调用,直接放在当前目录的plugin文件夹中,脚本解析架构能识别 脚本,在弹出菜单选择脚本项,解析出脚本界面。

16,466

社区成员

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

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

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