【问题标题】:How to unplug a USB device under Ubuntu and C/C++ without rebooting如何在不重启的情况下在 Ubuntu 和 C/C++ 下拔出 USB 设备
【发布时间】:2014-04-10 01:48:22
【问题描述】:

我正在使用带有 termios 的 C 程序在我的带有 Ubuntu 的电脑和 USB 电机控制器之间交换信息和命令。

效果很好,我可以通过串口成功发送消息;但是,有时如果我以错误的方式关闭程序或发生其他事情,我将无法再重新连接到我的 USB 设备。

为了能够再次连接到设备,我必须重新启动我的电脑并重新启动 ubuntu。

我想避免这个问题并找到一个解决方案来重新启用 USB 端口,而不必每次都重新启动我的系统。

第一次,我试图杀死所有正在使用 USB 端口的进程 (sudo killall -9 program_name),但端口仍然被阻塞,我必须重新启动它。

您能建议我一些避免重启的解决方案吗? 为什么会这样?

我以这种方式连接到USB端口(/dev/ttyACM0):

handle = open(port.c_str(), O_RDWR |O_NOCTTY | O_NDELAY);

    if(handle == RQ_INVALID_HANDLE)

    {

        cout<<"failed."<<endl;

        return RQ_ERR_OPEN_PORT;

    }

【问题讨论】:

  • +1。我的 Arduino USART 端口经常发生这种情况。
  • 如果您从物理上拔下/插入设备会怎样?我希望该设备将在新的/dev/xyz 上注册,但您应该能够连接到该设备。
  • 最好避免每次都重新启动! :(
  • @A.H.如果我物理拔出并再次插入它什么都不会发生:(我仍然需要重新启动才能使用它。dmesg 说:USB 断开连接,地址 5 然后当我再次插入它时:ttyACM0_ USB ACM 设备
  • 您可能想阅读superuser.com/a/148782/11572

标签: c++ c ubuntu serial-port termios


【解决方案1】:

为避免您的 USB 控制器无法使用,您可以强化程序以更好地处理程序终止。

创建一个例程来进行清理,即关闭 USB 连接。 我们就叫它void cleanup(void) {}

您可以使用 stdlib.h 中的 atexit 函数来注册一个函数,该函数将在程序正常终止时调用。这意味着主要通过exitreturn。见atexit man page 例如:int res = atexit(cleanup);

对于程序不规则终止的情况,例如通过信号(例如,当您按下 Ctrl+c 时的 SIGINT),您必须实现信号处理程序来处理这种情况。基本上你可以创建一个信号处理函数,它只调用你的清理例程并将它注册到你想要处理的所有信号。 有关如何执行此操作的更多详细信息:signal handler tutorial

如果您的程序以某种无法处理的方式终止,例如使用 SIGKILL,您将不得不重新启动或查看 pmg 在他的评论中链接到的帖子中的方法 - 它们看起来很有希望.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多