㈠ 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);
}
}
}
}