㈠ java串口通信中怎样以十六进制数发送
做串口通讯的时候基本都是通过流读取、输出。那么在java开发中发送数据的时候使用OutputStream,而其write()的参数是字节数组、int整形。如果使用字节数组发送的时候,通常可以直接写成out.write("1234".getBytes())。这样一来单片机读到的数据则是31 32 33 34。但是在串口发送的时候先把16进制字符串转化为byte数组在发送出来,则是发送什么读取到的就是什么。使用:out.write(HexString2Bytes("1234"));那么读取到的还是1234。16进制字符串转化为byte数组的方法为:
public static byte[] HexString2Bytes(String src) {
if (null == src || 0 == src.length()) {
return null;
}
byte[] ret = new byte[src.length() / 2];
byte[] tmp = src.getBytes();
for (int i = 0; i < (tmp.length / 2); i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
在用java做串口开发的时候建议使用开源的Rxtx做。效率、使用方法都要优。使用sun开源的comm个人觉得不是很便利。rxtx网上有开源实例。可以根据自己个需求进行加以修饰利用。
㈡ 什么数据是用16进制表示的
0x开始的数据表示16进制。
十六进制(hexadecimal)是计算机中数据的一种表示方法。它的规则是“逢十六进一”。
可使用数字符号的数目称为基数(en:radix)或底数,基数为n,即可称n进位制,简称n进制。最常用的是十进制,通常使用10个阿拉伯数字0-9进行记数。
十六进制数具有下列两个特点:
英文字母A,B,C,D,E,F分别表示数字10~15。
计数到F后,再增加1个,就进位。十六进制数是计算机常用的一种计数方法,它可以弥补二进制数书写位数过长的不足,也用于电视机中。
㈢ Java TCP socket通信,如何实现发送十六进制值,并在数据接收窗口中显示这些数据对应的字符串,非常感谢!
我自己的电脑上有一段源代码,就是基于TCP聊天小代码,能进行相互之间的消息接受。我的代码是直接传输字符串的,不是16进制滴。嗯,也贴出来看看吧!
运行服务器,c1,c2就可以了,c1与c2可进行通信。
Client.java
import java.net.*;
public class Client{
static byte num=1;
private int portNum;
public Client(int portnum){
this.portNum=portnum;
System.out.println("您是第"+num+"位客服端");
num++;
}
public void sentMessage(String me){
//都是向服务器发信息端口号1999
try{
DatagramSocket ds=new DatagramSocket();
DatagramPacket dp=new DatagramPacket(me.getBytes(),me.length(),InetAddress.getByName("127.0.0.1"),1999);
ds.send(dp);
ds.close();
}catch(Exception e){
e.printStackTrace();
}
}
public String receiveMessage(){
String str="";
try{
DatagramSocket ds=new DatagramSocket(this.portNum);//表示哦自己的接收端口号是1999
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.receive(dp);
str=new String(dp.getData(),0,dp.getLength());
ds.close();
}catch(Exception e){
e.printStackTrace();
}
return str;
}
}
c1.java
import java.util.*;
public class c1 implements Runnable{
Client cl;
boolean goon=true;
Scanner sc=new Scanner(System.in);
public c1(){
cl=new Client(2000);
System.out.println("这里是2000客户端\n你可以发送信息。请输入要发送的信息。out退出");
new Thread(this).start();
while(this.goon==true){
say();
}
if(goon==false){
System.exit(0);
}
}
public static void main(String[] args){
new c1();
}
public void say(){
String mess=sc.nextLine();
System.out.println("是否发送y/n");
String key=sc.nextLine();
if(key.equals("y")){
System.out.println("信息信息发送中……");
try{
cl.sentMessage(mess);
}catch(Exception e){
e.printStackTrace();
}
}
else if(key.equals("out")){
goon=false;
}
}
public void run(){
while(this.goon==true){
String sst="";
try{
sst=cl.receiveMessage();
}catch(Exception e){
e.printStackTrace();
}
if(sst.length()>0){
System.out.println(sst);
}
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
System.out.println("程序结束!");
}
}
c2.java
import java.util.*;
public class c2 implements Runnable{
Client cl;
boolean goon=true;
Scanner sc=new Scanner(System.in);
public c2(){
cl=new Client(2001);
System.out.println("这里是2001客户端\n你可以发送信息。请输入要发送的信息。out退出");
new Thread(this).start();
while(goon==true){
say();
}
if(goon==false){
System.exit(0);
}
}
public static void main(String[] args){
new c2();
}
public void say(){
String mess=sc.nextLine();
System.out.println("是否发送y/n");
String key=sc.nextLine();
if(key.equals("y")){
System.out.println("信息信息发送中……");
try{
cl.sentMessage(mess);
}catch(Exception e){
e.printStackTrace();
}
}
else if(key.equals("out")){
this.goon=false;
}
}
public void run(){
while(this.goon==true){
String sst="";
try{
sst=cl.receiveMessage();
}catch(Exception e){
e.printStackTrace();
}
if(sst.length()>0){
System.out.println(sst);
}
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
System.out.println("聊天关闭!");
}
}
Server.java
import java.net.*;
import java.util.*;
public class Server implements Runnable{
private String message;
boolean work=true;
byte tm=10;
String[] clomessage={"信息:正在断开网络连接.",".",".\n","信息:设置保存中……","","","完成\n","信息:欢迎下次使用\n","信息:完成\n","Goodbye!"};
public Server(){
new Thread(this).start();
System.out.println("本程序为服务端Server");
Scanner sc=new Scanner(System.in);
System.out.println("输入命令out关闭服务器");
String clo=sc.nextLine();
if(clo.equals("out")){
System.out.println("正在关闭服务器……");
setwork(false);
System.exit(0);
}
}
public static void main(String[] args){
new Server();
}
public void setwork(boolean bo)
{
this.work=bo;
}
public void setMessage(String str){
this.message=str;
}
public String getMessage(){
return this.message;
}
public void sentMessage(){
String mes=this.getMessage();
try{
DatagramSocket ds=new DatagramSocket();
DatagramPacket dp=new DatagramPacket(mes.getBytes(),mes.length(),InetAddress.getByName("127.0.0.1"),2000);
DatagramPacket dp2=new DatagramPacket(mes.getBytes(),mes.length(),InetAddress.getByName("127.0.0.1"),2001);
ds.send(dp);
ds.send(dp2);
ds.close();
System.out.println("信息发送至:127.0.0.1:2000 & 127.0.0.1:2001");
this.setMessage("");
}catch(Exception e){
e.printStackTrace();
}
}
public void receiveMessage() throws Exception{
try{
DatagramSocket ds=new DatagramSocket(1999);//表示哦自己的接收端口号是1999
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.receive(dp);
String str=new String(dp.getData(),0,dp.getLength());
if(str.length()>0){
this.setMessage(str);
System.out.println("信息:Server从"+dp.getAddress().getHostAddress()+"主机(端口号:"+dp.getPort()+")收到信息:"+this.getMessage());
}
ds.close();
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
while(tm>0){
if(work==false){
tm--;
System.out.print(clomessage[9-tm]);
}
try{
receiveMessage();//时刻接受信息
}catch(Exception e){
e.printStackTrace();
}
if(this.getMessage().length()>0){//如果接收到信息则发送信息
try{
sentMessage();
}catch(Exception e){
e.printStackTrace();
}
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
呵呵,请指教啊!
㈣ can通讯中为什么都是16进制显示
can通讯中16进制显示是为了便于人的阅读和记忆。十六进制码在电路中实际上是二进制码。CAN总线上的电平是相对的,D+高于D-一定的电平(不同的CAN收发器件的具体电平差有些差异)。
㈤ PLC通讯中数据帧的书写是用16进制吗
这个用几进制都可以,只要是plc支持的进制。在plc里几进制都一样,只是通信的数据一般喜欢用十六进制罢了,因为在分析报文时,对数据进行合并,拆分,十六进制比较方便。望采纳。。。。。。㈥ 有关通讯,ASCII,十六进制...还有编程
我的理解是这样子的:以ASCII进行数据传输的话是将数据转换成ASCII码(16进制),比如‘A’转换成41,。如果发出的值是‘H1000’的话,我们将接收到‘4831303030’,应该理解成十六进制的,这些值应该要进行编码转换成原来的值。呵呵,以上是我的一些看法,不知道对你是否有帮助。因为我做过串口通信的小实验,有一点点的理解。
㈦ 16进制通讯和ASCII通讯,哪个方式更快
这个还要看具体项目和实际情况
一般来说 数据量大的比如以太网通信用16进制
数据量小的使用ascii 比如低速的串行通信
ASCII最终也是按位存储的数据传送 效率上是比不上16进制
但是ascii易于处理 便于调试
在使用规程分析仪等设备的时候 ascii一目了然 调试及检测十分方便
㈧ 通讯为什么转成16进制,为什么常见的UDP通讯要转成16进制,不出现乱码吗
16 进制只是给人看的,因为通信过程经常不是文本方式可以阅读,多数情况下是二进制的数据,你看不懂的,也记不住,通常在程序中是以字节的形式表示,但有时候,连一个字符都算不上,而让一个字节包括多少状态位,这时,这个字节本身没有意义,有时候这个字节不能转换成可打印的字符,而有时候转换成可打印的字符后也是古怪的符号。只有转换成 16 进制更容易记忆。
16 进制本身只是把数字给你看的过程中转换了,真实的网络传递多数情况下还是以字节为单位发送数据的。你就不用担心乱码了。
㈨ 为什么串口发送指令要按照16进制发送
你要知道 电子设备之间的串口数据通信是:单位时间内的电压高低来进行传送的(编程的时候说的是二进制) 高电平位1 低电平位016进制FF 最大表示255所以换做二进制位11111111 综上所述 无论 你传送的是什么汉字也好 图片也罢 音乐也可以 归根结底 都是用电压来表示的这里涉及的范围有点大 我也说不清楚 你去了解下串口的通信 在物理上是怎么完成的 你就能理解了㈩ C#串口通讯接收数据为16进制如下
写了一个,不知道可不可以达到你的需求.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
namespace PortTestAAA
{
class Program
{
static void Main(string[] args)
{
PortOperator myTestPort = new PortOperator();
myTestPort.PortName = "COM1";
myTestPort.BaudRate = 9600;
myTestPort.DataChange += new PortOperator.DataChangeEventHandle(myTestPort_DataChange);
myTestPort.Start();
}
static void myTestPort_DataChange(object sender, byte[] data)
{
//在这里写你需要处理东西就行了
Console.WriteLine(Encoding.UTF8.GetString(data));
}
}
class PortOperator
{
public delegate void DataChangeEventHandle(object sender,byte[] data);
public event DataChangeEventHandle DataChange;
SerialPort gPort;
public string PortName { get; set; }
public int BaudRate { get; set; }
/// <summary>
/// Suspend : /ms
/// </summary>
public int Suspend { get; set; }
public PortOperator()
{
gPort = new SerialPort();
Suspend = 200;
}
void OnDataChange(byte[] data)
{
if (DataChange != null)
DataChange(this, data);
}
public void Start()
{
gPort.Close();
gPort.PortName = PortName;
gPort.BaudRate = BaudRate;
gPort.Open();
Thread thReadData = new Thread(() => { ReadData(); });
thReadData.IsBackground = true;
thReadData.Start();
}
void ReadData()
{
while (true)
{
Thread.Sleep(Suspend);
if (!gPort.IsOpen || gPort.BytesToRead < 1)
continue;
var buffer = new byte[gPort.BytesToRead];
gPort.Read(buffer, 0, buffer.Length);
OnDataChange(buffer);
}
}
}
}