我正在使用带有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;
}
答案 0 :(得分:3)
为避免使USB控制器无法使用,您可以强化程序以更好地处理程序终止。
创建一个例程,用于清理,即关闭USB连接。
我们称之为void cleanup(void) {}
您可以使用stdlib.h中的atexit
函数注册一个函数,该函数将在程序终止正常时调用。这意味着通过main中的exit
或return
。见atexit man page
例如:int res = atexit(cleanup);
对于不规则地终止程序的情况,例如通过信号(例如,按Ctrl + c时的SIGINT),你必须实现信号处理程序来处理这个问题。基本上你可以创建一个信号处理函数,它只调用你的清理例程并将它注册到你想要处理的所有信号。 有关如何执行此操作的详细信息:signal handler tutorial
如果您的程序以一种无法处理的方式终止,例如,使用SIGKILL,您将不得不重新启动或查看pmg在其评论中链接到的帖子中的方法 - 它们看起来很有希望