我正在Linux中使用termios api与串行设备进行通信。我正在尝试检测设备是否已断开连接,因此我可以尝试在超时后重新连接。我有以下示例代码:
while(1)
{
FD_ZERO(&rfds);
FD_SET(tty_fd, &rfds);
// have tried checking fcntl(tty_fd, F_GETFL); too
// Blocking call to wait until we have data
select(tty_fd+1, &rfds, NULL, NULL, NULL);
// While we have data, collect it
while (read(tty_fd, &c, 1)>0 && bytesRead++<200)
{
serialBuffer.push_back(c);
}
bytesRead = 0;
// Try to parse it
BufferParse();
}
在ttyUSB设备物理断开连接后,我实际上没有看到select()或fcntl返回错误值(-1)。我当然可以检查/ dev
/中的文件是否存在,但是我希望有一个更优雅的解决方案。
希望得到任何建议,谢谢!
首先值得一提的是,serial-usb的行为如下:
在USB设备上,拔出的断开连接称为
@disconnect:当不再可访问该接口时调用,通常是因为其设备已(或正在)断开连接或正在卸载驱动程序模块。
在我们的例子中是usb_serial_disconnect(struct usb_interface * interface)
调用usb_serial_console_disconnect(serial),调用tty_hangup …,依此类推。
您可以遵循从这里开始的链条:http : //lxr.free-
electrons.com/source/drivers/usb/serial/usb-serial.c#L1091
简而言之,这导致以下经典方式:
pselect表示文件描述符已准备就绪,并且ioctl(fd,FIONREAD和&len)返回零len。
就是这样,您拔出了设备。
求和(来自您的代码):
while(1)
{
FD_ZERO(&rfds);
FD_SET(tty_fd, &rfds);
// have tried checking fcntl(tty_fd, F_GETFL); too
// Blocking call to wait until we have data
int ready = select(tty_fd + 1, &rfds, NULL, NULL, NULL);
if(ready && FD_ISSET(tty_fd, &rfds)) {
size_t len = 0;
ioctl(tty_fd, FIONREAD, &len);
errsv = errno;
if(len == 0)
{
printf("prog_name: zero read from the device: %s.", strerror(errsv));
/* close fd and cleanup or reconnect etc...*/
exit(EXIT_FAILURE);
}
// While we have data, collect it
while (read(tty_fd, &c, 1)>0 && bytesRead++<200)
{
serialBuffer.push_back(c);
}
bytesRead = 0;
// Try to parse it
BufferParse();
}
}
很遗憾您没有说明您使用的是哪种设备。
如果您的设备能够进行RTS / CTS流量控制,则还可以检测到线路中断。
问题内容: 基本上,我有一个服务器循环,用于管理与一个单独客户端的连接。在循环的某一时刻,如果存在ClientSocket,它将尝试读取以检查客户端是否仍然连接: 问题是,一旦创建了套接字,应用程序将挂起读取,我假设正在等待永远不会到来的数据,因为客户端永远不会发送到服务器。在此之前还可以,因为正确处理了断开连接(客户端断开连接后读取将最终失败),并且循环将尝试重新建立连接。但是,我现在添加了上面
我目前正在开发一款android wear应用程序,它有两种模式:连接(与手机配对)和断开连接。我看了这个帖子(如何检测android设备是否与android wear watch配对)。我添加了侦听器来检测何时找到节点。 存在以下情况:-如果启动移动应用程序,wear应用程序将检测到节点并进入连接模式。-如果移动应用程序被杀死,它会在被销毁之前向手表发送一条消息,手表会进入断开连接模式如果蓝牙连
问题内容: 我想知道是否有可能检测浏览器是否在iOS上运行,这与使用Modernizr进行功能检测的方式类似(尽管这显然是设备检测而非功能检测)。 通常,我宁愿使用功能检测,但我需要根据该问题确定设备是否为iOS,因为它们处理视频的方式YouTube API无法在iPad / iPhone/非Flash设备上使用 问题答案: 我不喜欢User Agent嗅探,但是这是你的处理方式: 另一种方法是依
我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法: 如何确定tcp是否连接? 我的代码如下: 多谢帮忙。
我正在尝试检测已经连接到android的usb设备。我知道有动作可以检测USB何时连接或断开。但是我真的不知道如何在将usb设备连接到android后检查设备。另外,我发现每个USB设备都有它的设备类别代码,但是我怎么知道连接的是哪种设备呢?例如,我需要检测usb鼠标和键盘;我如何区分它们?
我的audio player应用程序当前正在侦听“ACTION\u ACL\u DISCONNECTED”事件,检查BluetoothDevice的意图。EXTRA_DEVICE,并检查该设备的类以查看它是否是BluetoothClass。装置专业AUDIO\u VIDEO设备。如果是这样,那么我想暂停播放。基本上,当蓝牙耳机或汽车连接断开时暂停。 然而,我发现这对一些实际上以其他方式收听的用户来