2

我正在使用带有 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;

    }
4

1 回答 1

3

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

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

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

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

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

于 2012-03-16T23:37:06.693 回答