如何在不重启的情况下拔掉Ubuntu和C / C ++下的USB设备

时间:2012-03-10 10:24:04

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

我正在使用带有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 个答案:

答案 0 :(得分:3)

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

创建一个例程,用于清理,即关闭USB连接。 我们称之为void cleanup(void) {}

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

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

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