最近 再做单片机 上 通过附加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 newnum = new ArrayList(); 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(); }