java 与 c 的通信
2013-11-18 17:18
423 查看
最近 再做单片机 上 通过附加ch374芯片 实现网口功能,本人负责pc端java 与c之间的通信。有一些心得写一下。
下面是通信代码+注解
Socket webclient = new Socket("172.17.101.99",80);
PrintWriter result = new PrintWriter(webclient.getOutputStream(),true);
result.println("GET /the0.net/");//发送数据
result.println();
//此处设置数组长度为1;因为发送端为8位数据;每次接收8位,接收四次;由于有大小尾端区别每次接收8位最适合。
byte[] temp= new byte[1];
StringBuffer sb = new StringBuffer();
InputStream inputStream = webclient.getInputStream();
//第一次接收数据
int numFlag= inputStream.read(temp);//用带byte数组参数的 read,有助于后面操作。
int flag= 1;
byte[] temps= new byte[4];
temps[0] = temp[0];
//以下while循环每循环4次,生成一个byte数组,第一次除外,第一次循环3次,因为外面有一次,其中的逻辑自行补充。其实此处写成do-while 更为合适一些。
while(numFlag!= -1) {
//再次接受数据 ,直到接收完毕。以下为略写逻辑自行补充。
numFlag= inputStream.read(temp);
temps[flag] = temp[0];
flag++;
if(flag==3){
//getFloat(temps);将长度为4的byte(byte[4])数组转化为float类型
//byte2Int(temps);将长度为4的byte(byte[4])数组转化为int类型
}
}
//此方法为网上借鉴
public static float getFloat(byte[] b) {
int accum = 0;
for ( int shiftBy = 0; shiftBy < 4; shiftBy++ ) {
accum |= (b[shiftBy] & 0xff) << shiftBy * 8;
}
return Float.intBitsToFloat(accum);
}
//此处由于我用的板子和pc大小为不兼容,所以需要转换下位置。 如0xab123456-> 0x563412ab
public static int byte2Int(byte[] b1) {
byte[] b = new byte[4];
for (int i = 0; i < b1.length; i++) {
b[3-i] = b1[i];
}
int intValue = 0;
for (int i = 0; i < b.length; i++) {
intValue += (b[i] & 0xFF) << (8 * (3 - i));
}
return intValue;
}
//十进制转换为16进制
public static String changeNum(int number) {
ArrayList<Integer> newnum = new ArrayList<Integer>();
int j = number % 16;
int i = number / 16;
newnum.add(j);
while (i != 0) {
j = i % 16;
i = i / 16;
newnum.add(j);
}
int length = newnum.size();
StringBuffer sb = new StringBuffer();
for (int k = 0; k < length; k++) {
switch (newnum.get(length-k-1)) {
case 10:sb.append("A") ;break;
case 11:sb.append("B") ;break;
case 12:sb.append("C");break;
case 13:sb.append("D") ;break;
case 14:sb.append("E");break;
case 15:sb.append("F") ;break;
default: sb.append(newnum.get(length-k-1).toString());
}
}
return sb.toString();
}
下面是通信代码+注解
Socket webclient = new Socket("172.17.101.99",80);
PrintWriter result = new PrintWriter(webclient.getOutputStream(),true);
result.println("GET /the0.net/");//发送数据
result.println();
//此处设置数组长度为1;因为发送端为8位数据;每次接收8位,接收四次;由于有大小尾端区别每次接收8位最适合。
byte[] temp= new byte[1];
StringBuffer sb = new StringBuffer();
InputStream inputStream = webclient.getInputStream();
//第一次接收数据
int numFlag= inputStream.read(temp);//用带byte数组参数的 read,有助于后面操作。
int flag= 1;
byte[] temps= new byte[4];
temps[0] = temp[0];
//以下while循环每循环4次,生成一个byte数组,第一次除外,第一次循环3次,因为外面有一次,其中的逻辑自行补充。其实此处写成do-while 更为合适一些。
while(numFlag!= -1) {
//再次接受数据 ,直到接收完毕。以下为略写逻辑自行补充。
numFlag= inputStream.read(temp);
temps[flag] = temp[0];
flag++;
if(flag==3){
//getFloat(temps);将长度为4的byte(byte[4])数组转化为float类型
//byte2Int(temps);将长度为4的byte(byte[4])数组转化为int类型
}
}
//此方法为网上借鉴
public static float getFloat(byte[] b) {
int accum = 0;
for ( int shiftBy = 0; shiftBy < 4; shiftBy++ ) {
accum |= (b[shiftBy] & 0xff) << shiftBy * 8;
}
return Float.intBitsToFloat(accum);
}
//此处由于我用的板子和pc大小为不兼容,所以需要转换下位置。 如0xab123456-> 0x563412ab
public static int byte2Int(byte[] b1) {
byte[] b = new byte[4];
for (int i = 0; i < b1.length; i++) {
b[3-i] = b1[i];
}
int intValue = 0;
for (int i = 0; i < b.length; i++) {
intValue += (b[i] & 0xFF) << (8 * (3 - i));
}
return intValue;
}
//十进制转换为16进制
public static String changeNum(int number) {
ArrayList<Integer> newnum = new ArrayList<Integer>();
int j = number % 16;
int i = number / 16;
newnum.add(j);
while (i != 0) {
j = i % 16;
i = i / 16;
newnum.add(j);
}
int length = newnum.size();
StringBuffer sb = new StringBuffer();
for (int k = 0; k < length; k++) {
switch (newnum.get(length-k-1)) {
case 10:sb.append("A") ;break;
case 11:sb.append("B") ;break;
case 12:sb.append("C");break;
case 13:sb.append("D") ;break;
case 14:sb.append("E");break;
case 15:sb.append("F") ;break;
default: sb.append(newnum.get(length-k-1).toString());
}
}
return sb.toString();
}
相关文章推荐
- 几种java通信(rmi,http,hessian,webservice)协议性能比较
- Android7.0 Binder通信(4) Java层中的Binder
- java项目之间的通信
- java: 线程间通信经典模型“生产者-消费者”模型的实现
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- java 网络通信socket实现简单实例
- JAVA中Socket编程(一)---通过TCP协议实现通信
- java和C#之间SOCKET通信的问题
- java分布式开发TCP/IP NIO无阻塞 Socket((基于消息方式实现系统间的通信) )(转)
- java_多线程_socket通信_多个客户端发送,服务器响应
- Java网络通信
- socket ( java ) 简单多个客户端、服务端通信(多线程)
- TCP和UDP两个协议在Java通信编程中是如何被使用的
- Java UDP通信(DatagramPacket类、DatagramSocket类、InetAddress类)
- Java Smack SDK 结合 Openfire服务器,建立IM通信,发送聊天消息
- Blaze和Java通信例子step by step
- java之管道流实现线程间的通信(图文版)
- JAVA与C#的TCP通信——JAVA客户端,C#线程池服务端
- http客户端通信 (java原生)
- java与C#用protobuf通信--java如何转换protobuf-net中的bcl.Decimal对象