拔掉USB线,重新插上之后串口数据无法读取

bberdong 2013-08-06 01:41:30
是这样的,硬件是由USB转232连接的DTU。程序可以读取设备从服务器发送过来的数据。但是拔下电脑端USB线再插上后,读不到串口数据。serial的IsOpen也返回true。不过呢,重启一下读取数据的程序就可以正常读取数据,请问一下高手们,怎么做才可以让设备重新连接上电脑之后,能正常从串口读出数据来。谢谢了,这个问题急待解决。
...全文
1261 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaof_lee 2015-05-25
  • 打赏
  • 举报
回复
因为目前我也在写一个USB串口通信软件,遇到了这个问题,于是我找到了如下代码,有需要的可以参考一下。 另外求教问题,我如何判断当前串口是用usb口转过来的?这个代码里边监听的是USB设备,不是串口,但是我的程序必须写串口才可以。 代码下载地址: http://download.csdn.net/detail/gaof_lee/8735689
AS1317253535 2015-05-21
  • 打赏
  • 举报
回复
亲们,说详细点啊,我也正遇到为个问题,
dceacho 2013-08-19
  • 打赏
  • 举报
回复
引用 10 楼 bberdong 的回复:
引用 8 楼 wangfan027 的回复:
我用别人写的一个C#库, 里面是有个设备注册的,必须在每次指定VID/PID设备插入后注册一下,不然就很可能出现第一次能用,但重新插拔一次后就不能用了
感觉你说的很接近真相了,但是能具体告诉我一下怎么做吗?

        public Form1()
        {
            InitializeComponent();
            OnHandleCreated(null);
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            usb.RegisterHandle(Handle);
        }
        //指定设备插入事件响应
        private void usb_OnSpecifiedDeviceArrived(object sender, EventArgs e)
        {
            OnHandleCreated(null);
        }
对于C#我现在只会照着别人的程序改,初始化时调用OnHandleCreated(null)一次,后面每次重新插拔一次后也调用一次.什么原理我也不清楚,你找找你那边有没有对应的函数
bberdong 2013-08-19
  • 打赏
  • 举报
回复
引用 8 楼 wangfan027 的回复:
我用别人写的一个C#库, 里面是有个设备注册的,必须在每次指定VID/PID设备插入后注册一下,不然就很可能出现第一次能用,但重新插拔一次后就不能用了
感觉你说的很接近真相了,但是能具体告诉我一下怎么做吗?
bberdong 2013-08-19
  • 打赏
  • 举报
回复
引用 7 楼 youzi722 的回复:
我的也是win32,我就在主窗口的消息处理函数里拦截WM_DEVICECHANGE消息,处理DBT_DEVNODES_CHANGED事件,然后用SetupApi函数枚举USB设备,看是否USB转串口插入或拔出了。
我的函数根本拦截不到那个消息,我用detours拦截了wndproc这个窗口函数,然后转到我自己的wndprocadapter.然后这函数能拦截到目标应用程序(钩子的目标),但是不能拦截这个WM_DEVICECHANGE消息。不知道为什么
youzi722 2013-08-09
  • 打赏
  • 举报
回复
我的也是win32,我就在主窗口的消息处理函数里拦截WM_DEVICECHANGE消息,处理DBT_DEVNODES_CHANGED事件,然后用SetupApi函数枚举USB设备,看是否USB转串口插入或拔出了。
dceacho 2013-08-09
  • 打赏
  • 举报
回复
我用别人写的一个C#库, 里面是有个设备注册的,必须在每次指定VID/PID设备插入后注册一下,不然就很可能出现第一次能用,但重新插拔一次后就不能用了
bberdong 2013-08-09
  • 打赏
  • 举报
回复
引用 3 楼 of123 的回复:
需要 PC 端的程序监测 OnDeviceChange 消息。当设备拔掉时,关闭串口。设备重新插入后,重新打开串口。
麻烦再问一下。具体怎么实现,我的dll里拦截了WndPro API,然后在这里响应你说的这个消息,但是无法捕捉。我得程序是win32的。
youzi722 2013-08-07
  • 打赏
  • 举报
回复
刚刚试了一下3楼的OnDeviceChange 消息方法,比用SetupApi方便多了,推荐用这个,今天不错,又学了一招。
youzi722 2013-08-07
  • 打赏
  • 举报
回复
这个应该和Windows的设备管理有关系,因为串口是非即插即用设备,而USB是即插即用设备,拔掉USB设备时如果对应的虚拟串口处于打开状态,导致串口设备无法删除,从而导致USB再次插入后映射串口设备错误,从而无法正常通信。可以用下面方式解决: 利用SetupApi枚举USB设备,检测该USB设备的插入或拔出,在检测到USB拔出的时刻把串口关掉。 不过需要注意的是,打开或关闭串口设备的设备名不能使用"COM1"之类的设备名,而应使用全路径名如"\\\\.\\COM1",否则是不行的.
of123 2013-08-07
  • 打赏
  • 举报
回复
需要 PC 端的程序监测 OnDeviceChange 消息。当设备拔掉时,关闭串口。设备重新插入后,重新打开串口。
palleexu 2013-08-06
  • 打赏
  • 举报
回复
是不是得串口初始化一下,你不重启程序,相当于不知道你要使用的串口是哪一个? 我曾经用过USB-232,感觉速度可慢,不好用。
bberdong 2013-08-06
  • 打赏
  • 举报
回复 1
手工置顶。谢谢大家了。
CH341的串口方式支持WINDOWS 98/ME/2000/XP/Vista/Linux,提供相关驱动程序, CH341的USB串口支持大多数常用的串口监控及调试工具程序。 驱动安装方法: 1. 标准INF文件安装方法 WINDOWS提示找到新硬件,指定驱动程序所在目录DRIVER,自动安装驱动, 如果WINDOWS没有提示找到新硬件,那么在设备管理器的硬件列表中, 选择带问号的USB设备,更新驱动程序并指定目录。 2. 使用驱动程序安装工具 先拔掉USB串口连接线,然后安装,然后插上连接线 直接使用CH341SER.EXE安装包,可以安装/升级/卸载驱动程序, 该方法更适用于最终用户。 CH341串口使用方法: CH341实现USB串口,在逻辑功能方面的使用方法与普通计算机串口相同。 与普通计算机串口的区别: CH341提供的是仿真串口,所以不支持串口本身的纯硬件操作,例如I/O操作, 普通计算机串口是静态设备,而CH341串口是动态设备,理论上随时会断开, CH341的附加功能(下面有介绍):读取外部串行EEPROM,支持更高波特率。 提供“模块调试”工具,启动后将“类型”选择为“手工输入发送”, 打开串口后就可以用于CH341串口或者普通串口的输入输出监控及收发调试。 注意事项: CH341串口是即插即用的USB设备,正在使用CH341串口进行数据传输的过程中, 不可以将其断开(断开是指从USB插座中取出CH341或者关闭CH341的电源), 也就是说,必须在应用程序关闭该串口后,CH341串口才可以从USB插座中拔出。 如果在应用程序使用CH341串口的过程中,CH341串口设备从USB插座中断开, 那么应用程序应该尽快关闭CH341串口并退出(关闭及退出可能需要数秒时间)。 如果在CH341串口通讯过程中发生错误,极有可能是CH341串口已经物理断开, 所以在检测到错误后建议关闭CH341串口,稍等两秒后再重新打开串口通讯。 采用设备事件通知的方法可以及时了解CH341串口设备的连接与断开, 从而使串口应用程序能够及时打开和关闭CH341串口串口动态链接库CH341PT.DLL提供了API,可以监视CH341串口插拔事件, 可以搜索和识别CH341串口等,具体需参考CH341PT.H文件。 如果通讯波特率较高,建议设置较大的缓冲区,尤其在WINDOWS 98/ME下, 线程调度能力和USB实时性都比WINDOWS 2000/XP差,如果串口接收缓冲区较小, 那么在通讯波特率较高时,接收大量数据会导致串口缓冲区溢出而丢弃数据。 由于底层的USB是将多个字节组成数据包后安插到各个1mS帧中进行传输, 所以有可能将串口收发的紧靠着的两个字节实际分割在两个USB数据包甚至 两个USB帧中,在最坏情况下这两个字节在时间上有可能相隔1mS甚至2mS。

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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