串口有大量数据涌入时无法关闭?

Dingnifei123 2009-12-11 04:43:01
如题。

波特率是 9600。

当打开串口接收数据时,如果一直处理串口设备发来的数据,直至完成(没有数据发送),正常结束,
则没有问题。

如果想中途关闭串口,则时常出现程序死掉,界面不能动的状况,

请问大家有没有遇到过,有什么解决办法?
...全文
291 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouzhipen 2009-12-16
  • 打赏
  • 举报
回复
我也遇到过这种问题,当有数据在传输时,比如向设备发送数据,设备并未接收时,如果此时用CloseHandle()关闭串口,CloseHandle则无论如何也不会返回.设备向程序发送数据,程序不接收,此时关闭串口也会出现同样的情阅况.
总之,只要数据在一方发送,另一方没有接收,就出现串不能关闭的情况.这个与是不是使用了多线程没有关系.
问题困了我很久也没有找到解决方法.最后我直接在关闭数据串口之前,先向指令串口发送一个关机指令,先关闭设备再关闭串口(设备上有再个通讯串口,一个用来传输数据,另一个传输指令).
alicktracy 2009-12-16
  • 打赏
  • 举报
回复
典型的多线程,创建一个新的线程处理后台.主线程响应界面.串口异步
zoulie 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jennyvenus 的回复:]
关闭串口,再关程序。

[/Quote]
关闭线程,串口,退出程序
jsthinker 2009-12-14
  • 打赏
  • 举报
回复
串口这块由其他人搞定,我主要负责文件的存取。

有同志建议用CByteArray动态数组存取文件,定义一个结构体,其中包含一个或若干个CByteArray类对象,具体怎么搞,实在有些乱,没思路啊。

楼主是怎么接收串口数据的?
Dingnifei123 2009-12-14
  • 打赏
  • 举报
回复
那你只有逐个突破了,
先把串口搞定,再搞文件存取,
jsthinker 2009-12-14
  • 打赏
  • 举报
回复
借楼主宝地提个相关问题。

用串口接收频谱仪测量的波形数据,每次测量时间不定,想把每次测量的数据单独存成一个二进制文件,可在事后还原出测量波形。

本身VC就用的不是很熟,又是第一次做这类东西,涉及串口和文件存取,很是卡壳啊!请高手指点一下思路,谢谢!
MoXiaoRab 2009-12-13
  • 打赏
  • 举报
回复
BOOL PurgeComm(HANDLE hFile,DWORD dwFlags )

HANDLE hFile //串口句柄
DWORD dwFlags // 需要完成的操作

参数dwFlags指定要完成的操作,可以是下列值的组合:

PURGE_TXABORT 终止所有正在进行的字符输出操作,完成一个正处于等待状态的重叠i/o操作,他将产生一个事件,指明完成了写操作

PURGE_RXABORT 终止所有正在进行的字符输入操作,完成一个正在进行中的重叠i/o操作,并带有已设置得适当事件

PURGE_TXCLEAR 这个命令指导设备驱动程序清除输出缓冲区,经常与PURGE_TXABORT 命令标志一起使用

PURGE_RXCLEAR 这个命令用于设备驱动程序清除输入缓冲区,经常与PURGE_RXABORT 命令标志一起使用
Dingnifei123 2009-12-13
  • 打赏
  • 举报
回复
自己再顶一下~
GARY 2009-12-12
  • 打赏
  • 举报
回复
1 搞一个接收线程处理数据
当你想停时
就设置线程标志
让它线程退出
2 发命令给设备
停止接收数据
然后再关闭

觉得这两条说的不错
——————————————————————————————————
JOYZML(菜鸟朱铭雷)
Dingnifei123 2009-12-12
  • 打赏
  • 举报
回复
自己顶一下~
Dingnifei123 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lfchen 的回复:]
//同步方式?
//ClearCommError()然后CloseHandle()
[/Quote]
非也,

是异步的,
FILE_FLAG_OVERLAPPED,
一条晚起的虫 2009-12-11
  • 打赏
  • 举报
回复
//同步方式?
//ClearCommError()然后CloseHandle()
用户 昵称 2009-12-11
  • 打赏
  • 举报
回复
关闭串口,再关程序。
lonelyhacker 2009-12-11
  • 打赏
  • 举报
回复
设置个定时器接收数据,在OnTimer()中,当接收数据的时候检测如果超时多长的时间就停止接收数据,删除

记时器,不再进行接收。
Dingnifei123 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ccpaishi 的回复:]
你的停止是如何停止的,收数据是在一个线程里面做的吗??
[/Quote]
没错,已经是在一个线程里收了,

ccpaishi 2009-12-11
  • 打赏
  • 举报
回复
你的停止是如何停止的,收数据是在一个线程里面做的吗??
lili0920 2009-12-11
  • 打赏
  • 举报
回复
发命令给设备 停止接收 数据 然后再关闭
oyljerry 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dingnifei123 的回复:]
如何暂停?

发命令给设备吗,先让他停止,然后再关闭串口吗?


[/Quote]
搞一个接收线程处理数据,当你想停时,就设置线程标志,让它线程退出
lonelyhacker 2009-12-11
  • 打赏
  • 举报
回复
当你中途关闭串口没有接收到传过来的数据的时候,是不是应该处理一下呢。

例如检测当超过1秒或者多少时间没接收到数据的时候就表示串口已关闭。停止接收数据。

个人想法。。
Dingnifei123 2009-12-11
  • 打赏
  • 举报
回复
如何暂停?

发命令给设备吗,先让他停止,然后再关闭串口吗?

加载更多回复(1)

16,471

社区成员

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

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

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