我正在将带有 librxtx-java 的设备连接到 Ubuntu。该代码之前在10.04中有效,但在12.04中它无法发现连接到计算机的usb-serial。
java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
while ( portEnum.hasMoreElements() )
{
CommPortIdentifier portIdentifier = portEnum.nextElement();
System.out.println( portIdentifier.getName() + " - " + getPortTypeName(portIdentifier.getPortType()) );
}
这部分代码永远不会进入 while 循环,尽管安装了适当的 librxtx-java 库,并且设备被识别(dmesg | tail 在一行中显示 USB“检测到串行设备转换器”)。
更新:
看来 Ubuntu 12.04 64 位无法与任何 USB 串行设备一起使用(尽管它们出现在 dmesg 中并显示为/dev/ttyUSB,这似乎不仅仅是 Java 的问题。
最佳答案
我安装了 Ubuntu 11.10 内核 3.0.0-12-generic-pae 和 librxtx-java 版本 2.2pre2-8。使用下面的代码,它可以正确列出我的串行端口。现在你已经正确安装了 usb 到串口转换器了吗?您需要检查转换器使用哪个端口。使用下面的示例应用程序,您可以尝试类似 java -cp/usr/share/java/RXTXcomm.jar: 的操作。获取通信端口 2
请确保您对/dev/中的 ttySXX 或 ttyUSBXX 文件具有正确的权限。
crw-rw---- 1 root dialout 4, 65 2012-02-29 01:08 /dev/ttyS1
crw-rw---- 1 root dialout 4, 66 2012-02-29 01:08 /dev/ttyS2
这些串行端口显示在我的系统中,想要运行该应用程序的用户应该在组拨出下。要添加您自己,请使用:
sudo usermod -a -G dialout username
您现在应该在“拨出”组中。
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;
public class GetCommPorts
{
static Enumeration<CommPortIdentifier> portList;
static CommPortIdentifier portId;
static SerialPort serialPort;
static OutputStream outputStream;
static boolean outputBufferEmptyFlag = false;
public static class SerialReader implements SerialPortEventListener
{
private InputStream in;
private byte[] buffer = new byte[1024];
public SerialReader(InputStream in)
{
this.in = in;
}
@Override
/**
* treat \n as end of block.
*/
public void serialEvent(SerialPortEvent ev)
{
int data;
try
{
int len = 0;
while ( (data = in.read()) > -1)
{
if (data == '\n')
{
break;
}
buffer[len++] = (byte) data;
}
System.out.println(new String(buffer, 0, len));
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(-1);
}
}
}
public static class SerialWriter implements Runnable
{
OutputStream out;
public SerialWriter(OutputStream out)
{
this.out = out;
}
@Override
public void run()
{
try
{
int c = 0;
while ( (c = System.in.read()) > -1)
{
this.out.write(c);
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(-1);
}
}
}
private static String getPortTypeName ( int portType )
{
switch ( portType )
{
case CommPortIdentifier.PORT_I2C:
return "I2C";
case CommPortIdentifier.PORT_PARALLEL:
return "Parallel";
case CommPortIdentifier.PORT_RAW:
return "Raw";
case CommPortIdentifier.PORT_RS485:
return "RS485";
case CommPortIdentifier.PORT_SERIAL:
return "Serial";
default:
return "unknown type";
}
}
private static void listPorts()
{
@SuppressWarnings("unchecked")
java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
while ( portEnum.hasMoreElements() )
{
CommPortIdentifier portIdentifier = portEnum.nextElement();
System.out.println(portIdentifier.getName() + " - " + getPortTypeName(portIdentifier.getPortType()) );
if (portIdentifier.getPortType() == 1)
{
try
{
serialPort = (SerialPort) portIdentifier.open(portIdentifier.getName(), 3000);
}
catch (PortInUseException e)
{
System.err.print("port in use");
continue;
}
System.out.println("Baud is " + serialPort.getBaudRate());
System.out.println("Bits is " + serialPort.getDataBits());
System.out.println("Stop is " + serialPort.getStopBits());
System.out.println("Par is " + serialPort.getParity());
serialPort.close();
}
}
}
private static int doReadWrite(String portName)
{
CommPortIdentifier portIdentifier;
try
{
portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if (portIdentifier.isCurrentlyOwned())
{
System.err.println("error: port is currently in use");
return -1;
}
SerialPort sport = (SerialPort) portIdentifier.open(portName, 3000);
sport.setSerialPortParams(57600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
InputStream in = sport.getInputStream();
OutputStream out = sport.getOutputStream();
(new Thread(new SerialWriter(out))).start();
sport.addEventListener(new SerialReader(in));
sport.notifyOnDataAvailable(true);
}
catch (NoSuchPortException e)
{
e.printStackTrace();
return -1;
}
catch (PortInUseException e)
{
e.printStackTrace();
return -1;
}
catch (UnsupportedCommOperationException e)
{
e.printStackTrace();
return -1;
}
catch (IOException e)
{
e.printStackTrace();
return -1;
}
catch (TooManyListenersException e)
{
e.printStackTrace();
return -1;
}
return 0;
}
static void showHelp()
{
System.out.println("Usage " + GetCommPorts.class.getName() + "N");
System.out.println("1 read and write from the serial port");
System.out.println("2 list all serial ports in the system");
System.out.println("default show this help ");
}
public static void main(String[] args)
{
int operation = 0;
try
{
if (args.length != 1)
{
showHelp();
return;
}
operation = Integer.parseInt(args[0]);
}
catch (NumberFormatException e)
{
}
switch (operation)
{
case 1:
doReadWrite("/dev/ttyUSB0");
break;
case 2:
listPorts();
break;
default:
showHelp();
}
}
}
此应用程序的输出:
$ java -cp /usr/share/java/RXTXcomm.jar:. GetCommPorts 2
/dev/ttyS1 - Serial
Baud is 9600
Bits is 8
Stop is 1
Par is 0
/dev/ttyS0 - Serial
Baud is 9600
Bits is 8
Stop is 1
Par is 0
关于java - Ubuntu RXTX 无法识别 USB 串口设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628988/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'