|
通過串口通訊,從相應(yīng)的串口讀出和寫入數(shù)據(jù)啊。串口初始化時(shí)要定義好協(xié)議支持的波特率等,以下是我用C#讀出測距模塊距離數(shù)值的示例代碼:
using System.Collections;
using System.IO.Ports;
using System;
using System.Collections.Generic;
using System.Threading;
namespace Set3
{
public class 縱深探測
{
static SerialPort sp = null;
public enum 波特率
{
br9600,
br115200
};
public string depthport = "COM6";
public enum 深度模式
{
遠(yuǎn)距,
快速,
高精度,
普通
};
public 波特率 碼率1 = 波特率.br9600;
public 深度模式 模式 = 深度模式.高精度;
Thread dataReceiveThread;
int[] data = new int[6]; //用于存儲(chǔ)depth數(shù)據(jù)
static Byte[] command = new Byte[3]; //控制指令代碼
static int distance = 2500;
static int detectmode = 2;
static bool vbrflag = false;
static int tms=1, itv=0;
static Thread vbrThread;
void Start()
{
StartCoroutine("InitSP");
}
void Update()
{
distance = (data[2] << 8) | data[3];
detectmode = data[4];
}
void OnDestroy()
{
//dataReceiveThread.Abort();
//vbrThread.Abort();
ClosePort();
}
float na(float x)
{
if (x > 32767f) return x - 65536f;
else return x;
}
void setDetectMode()
{
Byte cmdcode, checksum;
switch (模式)
{
case 深度模式.遠(yuǎn)距:
cmdcode = 0x50;
checksum = 0xF5;
break;
case 深度模式.快速:
cmdcode = 0x51;
checksum = 0xF6;
break;
case 深度模式.高精度:
cmdcode = 0x52;
checksum = 0xF7;
break;
case 深度模式.普通:
cmdcode = 0x53;
checksum = 0xF8;
break;
default:
cmdcode = 0;
checksum = 0;
break;
}
command[0] = 0xA5;
command[1] = cmdcode;
command[2] = checksum;
sp.Write(command, 0, 3);
}
void setBaudRate()
{
Byte cmdcode, checksum;
switch (碼率1)
{
case 波特率.br9600:
cmdcode = 0xAE;
checksum = 0x53;
break;
case 波特率.br115200:
cmdcode = 0xAF;
checksum = 0x54;
break;
default:
cmdcode = 0;
checksum = 0;
break;
}
command[0] = 0xA5;
command[1] = cmdcode;
command[2] = checksum;
sp.Write(command, 0, 3);
}
public static bool getportstat()
{
return sp.IsOpen;
}
public static int getdetectmode()
{
return detectmode;
}
public static int getdistance()
{
return distance;
}
IEnumerator InitSP()//加載配置
{
OpenPort();
dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));
dataReceiveThread.Start();
yield return sp;
setBaudRate();
setDetectMode();
}
public void OpenPort()
{
sp = new SerialPort(depthport, 9600, Parity.None, 8, StopBits.One);
sp.ReadTimeout = 400;
try
{
sp.Open();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
public void ClosePort()
{
try
{
sp.Close();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
void DataReceiveFunction()
{
if (!sp.IsOpen)Debug.Log(depthport+" cannot open");
else Debug.Log(depthport + " successful inited");
byte[] buffer = new byte[128];
int bytes = 0;
//定義協(xié)議
int flag0 = 0x5A;
int flag1 = 0x5A;
int index = 0; //用于記錄此時(shí)的數(shù)據(jù)次序
while (true)
{
if (sp != null && sp.IsOpen)
{
try
{
bytes = sp.Read(buffer, 0, buffer.Length);
for (int i = 0; i < bytes; i++)
{
if (buffer[i] == flag0 || buffer[i] == flag1)
{
index = 0;//次序歸0
continue;
}
else
{
if (index >= data.Length) index = data.Length - 1
data[index] = buffer[i];//將數(shù)據(jù)存入data中
index++;
}
}
}
catch (Exception ex)
{
if (ex.GetType() != typeof(ThreadAbortException))
{
Debug.Log(ex.Message);
}
}
}
Thread.Sleep(10);
}
}
public static void startvbr(int times,int interval)
{
vbrflag = true;
command[0] = 0xA5;
command[1] = 0xAA;
command[2] = 0x4F;
tms = times;
itv = interval;
vbrThread = new Thread(new ThreadStart(vbrloop));
vbrThread.Start();
}
static void vbrloop()
{
if (tms == 0)
{
while (vbrflag)
{
sp.Write(command, 0, 3);
Thread.Sleep(100 + itv);
}
} //持續(xù)振動(dòng)
else
{
for (int i = 0; i < tms; i++)
{
if (vbrflag) sp.Write(command, 0, 3);
Thread.Sleep(100 + itv);
}
} //按設(shè)定次數(shù)和間隔振動(dòng)
stopvbr();
}
public static void stopvbr()
{
vbrflag = false;
vbrThread.Abort();
}
}
//Byte0:0x5A //幀頭
//Byte1:0x5A //幀頭
//Byte2:0x15 //數(shù)據(jù)類型
//Byte3:0x03 //數(shù)據(jù)量
//Byte4:0x00~0xFF //數(shù)據(jù)高8位
//Byte5:0x00~0xFF //數(shù)據(jù)低8位
//Byte6:0x00~0xFF //測量模式
//0x03 一般測量 0~1.2m 35ms ±2cm
//0x02 高精度(默認(rèn)) 0~1.2m 200ms ±1cm
//0x01 快速測量 0~1.2m 22ms ±3cm
//0x00 長距離 0~2m 35ms ±4cm
//Byte7:0x00~0xFF //校驗(yàn)和(僅保留低位)
//指令設(shè)置:0xA5+command+sum
//輸出模式設(shè)置
//0xA5+0x45+0xEA 連續(xù)輸出
//0xA5+0x15+0xBA 查詢輸出
//保存配置
//0xA5+0x25+0xCA 保存波特率、測量模式、輸出模式設(shè)置
//測量模式設(shè)置
//0xA5+0x50+0xF5 長距離
//0xA5+0x51+0xF6 快速
//0xA5+0x52+0xF7 高精度()
//0xA5+0x53+0xF8 一般
//波特率設(shè)置
//0xA5+0xAE+0x53 9600()
//0xA5+0xAF+0x54 115200
}
|
|