b***i 发帖数: 3043 | 1 或者说,Java和C++进行通信最好的方式是什么?需要从Java发出信号,也需要Java获
得信息。 |
d****i 发帖数: 4809 | 2 If you don't want to have any overhead of IPC, then JNI is the best bet, or
if you don't want to write JNI wrapper function, then JNA (Java-Native-
Access) is an alternative way. Of course, there is SWIG to connect C/C++
with any other high level languages including Java:
http://www.swig.org/index.php
You may use that too. Also there are some ongoing effort by RedHat people to
make the C++<->Java bridge easier, called "Project Panama", but I haven't
tried that.
【在 b***i 的大作中提到】 : 或者说,Java和C++进行通信最好的方式是什么?需要从Java发出信号,也需要Java获 : 得信息。
|
b***i 发帖数: 3043 | 3 从C++读串口然后能通知Java吗?就是回叫?
or
to
【在 d****i 的大作中提到】 : If you don't want to have any overhead of IPC, then JNI is the best bet, or : if you don't want to write JNI wrapper function, then JNA (Java-Native- : Access) is an alternative way. Of course, there is SWIG to connect C/C++ : with any other high level languages including Java: : http://www.swig.org/index.php : You may use that too. Also there are some ongoing effort by RedHat people to : make the C++<->Java bridge easier, called "Project Panama", but I haven't : tried that.
|
w***g 发帖数: 5958 | 4 你干脆把你的project整个描述一遍得了。
你这么一步一步地问问题,得到的也只是局部最优解。
像你这样每一步都要来问的,你觉得你设计的架构能行吗?
【在 b***i 的大作中提到】 : 从C++读串口然后能通知Java吗?就是回叫? : : or : to
|
z****e 发帖数: 54598 | 5 json
web service是最简单的
其次用vert.x的bus也行
不过麻烦不少
还有rpc之类的,以前的corba之类的
没有意义,或者你干脆直接用socket
参考swift那个socket,把两个c文件单独取出来就好了
http://github.com/swiftsocket/SwiftSocket/tree/master/SwiftSock |
z****e 发帖数: 54598 | 6 json
web service是最简单的
其次用vert.x的bus也行
不过麻烦不少
还有rpc之类的,以前的corba之类的
没有意义,或者你干脆直接用socket
参考swift那个socket,把两个c文件单独取出来就好了
http://github.com/swiftsocket/SwiftSocket/tree/master/SwiftSock |
p***o 发帖数: 1252 | 7 vertx3有RecordParser,写个按行传的tcp也就几行,还能用telnet调试。
【在 z****e 的大作中提到】 : json : web service是最简单的 : 其次用vert.x的bus也行 : 不过麻烦不少 : 还有rpc之类的,以前的corba之类的 : 没有意义,或者你干脆直接用socket : 参考swift那个socket,把两个c文件单独取出来就好了 : http://github.com/swiftsocket/SwiftSocket/tree/master/SwiftSock
|
z****e 发帖数: 54598 | 8
嗯,不错,你搞得比我深了现在
我这个功能还没试过
不过telnet那个我弄过
要启动shell service
【在 p***o 的大作中提到】 : vertx3有RecordParser,写个按行传的tcp也就几行,还能用telnet调试。
|
p***o 发帖数: 1252 | 9 没那么复杂,我是说用系统自带的telnet直接连tcp端口收发字符串调试。
以前浏览器不能inspect element又懒得tcpdump的时候用telnet调http也差不多
【在 z****e 的大作中提到】 : : 嗯,不错,你搞得比我深了现在 : 我这个功能还没试过 : 不过telnet那个我弄过 : 要启动shell service
|
z****e 发帖数: 54598 | 10
vert.x启动一个shell service很容易的
照着做,然后可以listen bus里面的msg
还可以模拟发射msg给某个verticle
测试时候很顶用,而且支持不同的参数格式
比如-*,--*, D*,启动后就可以telnet连进去了
shell service是3.1呼声很高的一个module
以后会逐步强化这个功能,现在刚起步
【在 p***o 的大作中提到】 : 没那么复杂,我是说用系统自带的telnet直接连tcp端口收发字符串调试。 : 以前浏览器不能inspect element又懒得tcpdump的时候用telnet调http也差不多
|
|
|
b***i 发帖数: 3043 | 11 Zynq CPU,十个串口,一个显示设备,320x240 24色,需要直接控制或者通过显示芯片
控制
要求,TCP/IP, 串口通信,存盘。
Java程序要进行串口的发送,和接受,TCP/IP的listen, connect, receive, send等。
还要把一个BufferedImage的内容显示到显示器,不需要各类鼠标和键盘的点击等。所
以,按钮输入想通过JNI和C++程序的GPIO查询获得。
C++程序负责向显示设备的Linux驱动程序输出,负责串口的发送和接收,并通知Java串
口数据完成。我可能每10毫秒查一次,看有没有字符输入,没有了就把所有的内容发给
Java。
Java的Modbus和TCP/IP都比较成熟,而如果用C++要用Boost.asio
同时,这些串口是在FPGA里面实现的,用Xilinx Vivado加入,目的是Linux能够控制这
些串口
【在 w***g 的大作中提到】 : 你干脆把你的project整个描述一遍得了。 : 你这么一步一步地问问题,得到的也只是局部最优解。 : 像你这样每一步都要来问的,你觉得你设计的架构能行吗?
|
w***g 发帖数: 5958 | 12 如果只是用底层的socket,串口通信,文件操作,C++和java没啥大差别,
犯不着混合编程。用C++可能更容易点。
如果网络操作想省点事,并且协议比较自由,那么在C++上用thrift或者gRPC都很方便,
错误处理也更方便。这年头不兴自己写socket了。
如果想跑一个http服务器,C++有https://github.com/datasift/served,底层用
boost.asio实现的。关键是要避免自己设计网络协议。
GPIO如果是linux的话似乎直接用标准文件操作读写设备文件就行,java和C++一样。
如果是我,不到万不得已不会上JNI。
【在 b***i 的大作中提到】 : Zynq CPU,十个串口,一个显示设备,320x240 24色,需要直接控制或者通过显示芯片 : 控制 : 要求,TCP/IP, 串口通信,存盘。 : Java程序要进行串口的发送,和接受,TCP/IP的listen, connect, receive, send等。 : 还要把一个BufferedImage的内容显示到显示器,不需要各类鼠标和键盘的点击等。所 : 以,按钮输入想通过JNI和C++程序的GPIO查询获得。 : C++程序负责向显示设备的Linux驱动程序输出,负责串口的发送和接收,并通知Java串 : 口数据完成。我可能每10毫秒查一次,看有没有字符输入,没有了就把所有的内容发给 : Java。 : Java的Modbus和TCP/IP都比较成熟,而如果用C++要用Boost.asio
|
d****i 发帖数: 4809 | 13 re, I think he's trying to use Java on Linux for embedded development. This
is the worst idea to use Java in a wrong case. Using C++ is just fine and
much more efficient and no need to use JNI. Even just use Python, PHP or
Node.js as a thin wrapper is better and light-weight than Java on embedded
system.
便,
【在 w***g 的大作中提到】 : 如果只是用底层的socket,串口通信,文件操作,C++和java没啥大差别, : 犯不着混合编程。用C++可能更容易点。 : 如果网络操作想省点事,并且协议比较自由,那么在C++上用thrift或者gRPC都很方便, : 错误处理也更方便。这年头不兴自己写socket了。 : 如果想跑一个http服务器,C++有https://github.com/datasift/served,底层用 : boost.asio实现的。关键是要避免自己设计网络协议。 : GPIO如果是linux的话似乎直接用标准文件操作读写设备文件就行,java和C++一样。 : 如果是我,不到万不得已不会上JNI。
|
T********i 发帖数: 2416 | 14 从你近来提问的问题来看。你还有很长一段路走。
你别把串口不当回事。你自己还一直在纠结TCP/IP。别人也都顺着你的提问回帖。
你半个月,能把串口搞清楚就不错了。串口的异步通信和TCP/IP的异步通信是一样的。
连API都一样。串口可能比TCP/IP还恶心。写一个能demo的不难。写一个能处理各种
corner case的串口应用,我甚至怀疑这个版上谁有过这种经验?
【在 b***i 的大作中提到】 : 或者说,Java和C++进行通信最好的方式是什么?需要从Java发出信号,也需要Java获 : 得信息。
|
d****i 发帖数: 4809 | 15 魏老师一看就是自己写过这个的明白人,我们以前自己写过一个完整的RS232的C的串口
程序,非常复杂,因为先是在没有OS的裸板环境下,后来用到了RTOS下面,所以各种
case处理非常复杂,最后终于有了一套通用的库,然后用C++ wrap了一下,才算正本归
元。network stack应该比串口更复杂,如果不用lib都自己写的话。
【在 T********i 的大作中提到】 : 从你近来提问的问题来看。你还有很长一段路走。 : 你别把串口不当回事。你自己还一直在纠结TCP/IP。别人也都顺着你的提问回帖。 : 你半个月,能把串口搞清楚就不错了。串口的异步通信和TCP/IP的异步通信是一样的。 : 连API都一样。串口可能比TCP/IP还恶心。写一个能demo的不难。写一个能处理各种 : corner case的串口应用,我甚至怀疑这个版上谁有过这种经验?
|
w***g 发帖数: 5958 | 16 我有一阵玩arduino,自己用max232焊过一个接口连电脑。
http://www.wdong.org/wordpress/blog/2012/07/09/max232-breakout-
确实是超级恶心,光配置个minicom都快吐了。
这年头人脸识别都很容易做了,写串口通信还是那么难,
别说异步通信了。
刚刚找了下程序,串口通信还真是用boost::asio写的, 用串口通过arduino
烧51单片机rom,程序在这里
http://www.wdong.org/wordpress/blog/2012/07/04/programming-at89
应证一下魏老师关于串口和TCP/IP连API都一样的claim。不过我那个程序只能在
天时地利人和的情况下才能运行,无法处理corner case。
【在 d****i 的大作中提到】 : 魏老师一看就是自己写过这个的明白人,我们以前自己写过一个完整的RS232的C的串口 : 程序,非常复杂,因为先是在没有OS的裸板环境下,后来用到了RTOS下面,所以各种 : case处理非常复杂,最后终于有了一套通用的库,然后用C++ wrap了一下,才算正本归 : 元。network stack应该比串口更复杂,如果不用lib都自己写的话。
|
d****i 发帖数: 4809 | 17 arduino还算好了,毕竟是Linux,要是那些RTOS的话,有些连device driver都没有现
成的要自己写。
【在 w***g 的大作中提到】 : 我有一阵玩arduino,自己用max232焊过一个接口连电脑。 : http://www.wdong.org/wordpress/blog/2012/07/09/max232-breakout- : 确实是超级恶心,光配置个minicom都快吐了。 : 这年头人脸识别都很容易做了,写串口通信还是那么难, : 别说异步通信了。 : 刚刚找了下程序,串口通信还真是用boost::asio写的, 用串口通过arduino : 烧51单片机rom,程序在这里 : http://www.wdong.org/wordpress/blog/2012/07/04/programming-at89 : 应证一下魏老师关于串口和TCP/IP连API都一样的claim。不过我那个程序只能在 : 天时地利人和的情况下才能运行,无法处理corner case。
|
T********i 发帖数: 2416 | 18 我20年前就写过GPIO模拟串口的。
RTOS, MCU,Linux,Windows串口都写过。
串口恶心就在于一根线叫UART,两根线双向,增加其他I/O针脚就有RS232和485之类的
。485还是半双工。232为了当年modem设计的,有什么响铃线之类的现在的小年轻估计
很难理解。当年俺还有过电传打字机当显示器玩basic,一个list命令打印出一张纸的
神奇体验。
标准确实有。具体实现遵守多少就是另外一回事。
至于flow control,buffer,时序之类的要考虑的比TCP/IP还多。至少TCP/IP还不会丢
数据。你串口那一边要是一个蠢货写的,啥事都能发生。
写一个随便插拔,两边都能自我恢复的。比TCP/IP困难多了。大多数情况,是根本不可
能的。 |
b***i 发帖数: 3043 | 19 我们的串口比你的 简单多了 ,没有 flowcontrol, 唯一多的是 9bit,多了个地址 位
,更像嵌入式,要不然和台式机 一样 。
我们的需求是Modbus,要实现coil, input, holding等几个,而不是全部功能。
TCP/IP首先也是Modbus,然后要能够理解JSON,返回JSON。
嵌入式设备首先要跟串口通信,我觉得可以用同步,为什么要异步?多线程每隔10毫秒
看看串口的缓冲里面有多少,读进来。Modbus规定,如果有3.5个字符的时间没有输入
,说明完成。一共不到255个字符,满了就处理。而且Modbus有CRC,不符合规定就不处
理,只记录下来。
TCP/IP更是容易,Java有个Modbus TCP的库,要是C++我岂不是要重新发明轮子?连C#
用的都是Java那个。
真是不知道难在哪里。你再给个例子?
【在 T********i 的大作中提到】 : 我20年前就写过GPIO模拟串口的。 : RTOS, MCU,Linux,Windows串口都写过。 : 串口恶心就在于一根线叫UART,两根线双向,增加其他I/O针脚就有RS232和485之类的 : 。485还是半双工。232为了当年modem设计的,有什么响铃线之类的现在的小年轻估计 : 很难理解。当年俺还有过电传打字机当显示器玩basic,一个list命令打印出一张纸的 : 神奇体验。 : 标准确实有。具体实现遵守多少就是另外一回事。 : 至于flow control,buffer,时序之类的要考虑的比TCP/IP还多。至少TCP/IP还不会丢 : 数据。你串口那一边要是一个蠢货写的,啥事都能发生。 : 写一个随便插拔,两边都能自我恢复的。比TCP/IP困难多了。大多数情况,是根本不可
|
T********i 发帖数: 2416 | 20 就是这个10ms。就够我琢磨好几天的。
而且你的波特率是多少?波特率越高3.5字符的时间就越短。就算你10ms 7个字符好了
。波特率才5.6K。一夜回到40年前。
【在 b***i 的大作中提到】 : 我们的串口比你的 简单多了 ,没有 flowcontrol, 唯一多的是 9bit,多了个地址 位 : ,更像嵌入式,要不然和台式机 一样 。 : 我们的需求是Modbus,要实现coil, input, holding等几个,而不是全部功能。 : TCP/IP首先也是Modbus,然后要能够理解JSON,返回JSON。 : 嵌入式设备首先要跟串口通信,我觉得可以用同步,为什么要异步?多线程每隔10毫秒 : 看看串口的缓冲里面有多少,读进来。Modbus规定,如果有3.5个字符的时间没有输入 : ,说明完成。一共不到255个字符,满了就处理。而且Modbus有CRC,不符合规定就不处 : 理,只记录下来。 : TCP/IP更是容易,Java有个Modbus TCP的库,要是C++我岂不是要重新发明轮子?连C# : 用的都是Java那个。
|
|
|
b***i 发帖数: 3043 | 21 有道理。
我也考虑过这个问题。我们10个串口的波特率是最高3600每秒,最低1200。所以基本没
有问题?
另有一个串口连RS485,同时连这十个设备,要1Mbps。这么高速度,我们就不考虑3.5
字符了。线程 里先查又没有接收到,然后立刻发送。等的时间应该够了。这个可能需
要1毫秒查一次,不知道Linux能否实现?主要是串口没有定义什么时候叫结束。要不然
结束了通知我就行了。
别问我为什么不用TCP/IP和这十个设备通信,我连串口都不想用,我就不想有这十个设
备,尽量简化,成串口设备了。主要用来调节电压的。
【在 T********i 的大作中提到】 : 就是这个10ms。就够我琢磨好几天的。 : 而且你的波特率是多少?波特率越高3.5字符的时间就越短。就算你10ms 7个字符好了 : 。波特率才5.6K。一夜回到40年前。
|
T********i 发帖数: 2416 | 22 就一个问题。你怕不怕偶尔丢数据吧?如果不怕,比如丢了可以再读一次。那就没问题。
否则,你这方法不沃克。
5
【在 b***i 的大作中提到】 : 有道理。 : 我也考虑过这个问题。我们10个串口的波特率是最高3600每秒,最低1200。所以基本没 : 有问题? : 另有一个串口连RS485,同时连这十个设备,要1Mbps。这么高速度,我们就不考虑3.5 : 字符了。线程 里先查又没有接收到,然后立刻发送。等的时间应该够了。这个可能需 : 要1毫秒查一次,不知道Linux能否实现?主要是串口没有定义什么时候叫结束。要不然 : 结束了通知我就行了。 : 别问我为什么不用TCP/IP和这十个设备通信,我连串口都不想用,我就不想有这十个设 : 备,尽量简化,成串口设备了。主要用来调节电压的。
|
b***i 发帖数: 3043 | 23 偶尔丢了 不要紧,我们一直发呢。其实我们要求20%成功就算成功。另外,我写的C#程
序在Windows下能够用14个串口同时进行通信,1秒一次,也是正常运行了7个月。不过
,有的时候Windows有些忙,会出现错误,但是我能处理这个异常,一般几天丢掉几个。
到Linux,要求1秒能够发最多6次,每个单独控制。还有就是多了一个高速串口1Mbps。
因为考虑到Linux更可靠,没有GUI(自己的嵌入式设备是完全控制的,不是OS自己控制
的),所以搞个串口同步通信还是没有问题的吧。我们组新人也是2个星期就搞出来C串
口程序,就两个文件而已。为什么大家这么怕串口?
题。
【在 T********i 的大作中提到】 : 就一个问题。你怕不怕偶尔丢数据吧?如果不怕,比如丢了可以再读一次。那就没问题。 : 否则,你这方法不沃克。 : : 5
|
T********i 发帖数: 2416 | 24 我不是说了么?不怕丢数据。丢了数据不用恢复。你这么做行。你知道再多也没用。
个。
【在 b***i 的大作中提到】 : 偶尔丢了 不要紧,我们一直发呢。其实我们要求20%成功就算成功。另外,我写的C#程 : 序在Windows下能够用14个串口同时进行通信,1秒一次,也是正常运行了7个月。不过 : ,有的时候Windows有些忙,会出现错误,但是我能处理这个异常,一般几天丢掉几个。 : 到Linux,要求1秒能够发最多6次,每个单独控制。还有就是多了一个高速串口1Mbps。 : 因为考虑到Linux更可靠,没有GUI(自己的嵌入式设备是完全控制的,不是OS自己控制 : 的),所以搞个串口同步通信还是没有问题的吧。我们组新人也是2个星期就搞出来C串 : 口程序,就两个文件而已。为什么大家这么怕串口? : : 题。
|
b***i 发帖数: 3043 | 25 以前用串口,被我说服改用TCP/IP来负责底层的完整性,我们只考虑内容,然后内容用
JSON,怎么样。要是嵌入式能用Java就完美了。
【在 T********i 的大作中提到】 : 我不是说了么?不怕丢数据。丢了数据不用恢复。你这么做行。你知道再多也没用。 : : 个。
|
T********i 发帖数: 2416 | 26 Raspberry Pi上Java都用的好好的。你那台比raspberry pi强好多倍。没理由不能用。
你这个其实不算嵌入式。属于arm linux。
【在 b***i 的大作中提到】 : 以前用串口,被我说服改用TCP/IP来负责底层的完整性,我们只考虑内容,然后内容用 : JSON,怎么样。要是嵌入式能用Java就完美了。
|