C#中如何接收串口的16进制数据,并将其转换成10进制形式
我是刚学C#,对串口通信不太懂,如果可以,麻烦你将整个过程代码贴出,不好意思,目前只剩15分了,谢谢!...
我是刚学C#,对串口通信不太懂,如果可以,麻烦你将整个过程代码贴出,不好意思,目前只剩15分了,谢谢!
展开
3个回答
展开全部
给你发一个读取串口数据的类,按需求修改接收字符串的长度和接收规则
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
namespace GSM.Cls
{
class ReadComm
{
internal class CommReader
{
//单个缓冲区最大长度
private const int max = 6;
//数据计数器
private int count = 0;
private int countData = 1;
//变长标志数
//private int bufCount = 0;
//数字缓冲区
private Byte[] buffer = new Byte[max];
///
/// 串口控件
///
private SerialPort _Comm;
///
/// 扫描的时间间隔 单位毫秒
///
private Int32 _interval;
//数据处理函数
public delegate void HandleCommData(Byte[] data,SerialPort sPort);
//事件侦听
public event HandleCommData Handlers;
//负责读写Comm的线程
private Thread _workerThread;
internal CommReader(SerialPort comm, Int32 interval)
{
_Comm = comm;
//创建读取线程
_workerThread = new Thread(new ThreadStart(ReadComm));
//确保扫描时间间隔不要太小,造成线程长期占用cpu
if (interval < 10)
_interval = 10;
else
_interval = interval;
}
//读取串口数据,为线程执行函数
public void ReadComm()
{
while (true)
{
Object obj = null;
try
{
//每隔一定时间,从串口读入一字节
//如未读到,obj为null
obj = _Comm.ReadByte();
}
catch
{
}
if (obj == null)
{ //未读到数据,线程休眠
Thread.Sleep(_interval);
continue;
}
//将读到的一字节数据存入缓存,这里需要做一转换
buffer[count] = Convert.ToByte(obj);
if(buffer[0] == 0xFE )
{
count++;
}
//计算接收数据的结束位
//当达到指定长度时,这里的判断条件可以根据要求变为:
// 判断当前读到的字节是否为结束位,等等
//计算结束标志位,协议为除了开始标志位的其他数据值的异或值
if (count == 6 && buffer[1]==0x04)//我的接收规则是6位长度,第二个字节是0x04
{
//复制数据,并清空缓存,计数器也置零
Byte[] data = new Byte[6];//bufCount
//Array.Copy(buffer, data, bufCount);
Array.Copy(buffer, 0, data, 0, 6);
count = 0;
Array.Clear(buffer, 0, max);
//通知处理器处理数据
if (Handlers != null)
Handlers(data,_Comm);
}
if(count ==6 && buffer[1] != 0x04)
{
Array.Clear(buffer, 0, max);
count=0;
}
}
}
//启动读入器
public void Start()
{
//启动读取线程
if (_workerThread.IsAlive)
return;
if (!_Comm.IsOpen)
_Comm.Open();
_workerThread.Start();
while (!_workerThread.IsAlive);
}
//停止读入
public void Stop()
{
//停止读取线程
if (_workerThread.IsAlive)
{
_workerThread.Abort();
_workerThread.Join();
}
_Comm.Close();
}
}
}
}
// 把十六进制字符串转换成字节型和把字节型转换成十六进制字符串
public static string ByteToString(byte[] InBytes)
{
string StringOut = "";
foreach (byte InByte in InBytes)
{
StringOut = StringOut + String.Format("{0:X2} ", InByte);
}
return StringOut;
}
public static byte[] StringToByte(string InString)
{
string[] ByteStrings;
ByteStrings = InString.Split(" ".ToCharArray());
byte[] ByteOut;
ByteOut = new byte[ByteStrings.Length - 1];
for (int i = 0; i == ByteStrings.Length - 1; i++)
{
ByteOut[i] = Convert.ToByte(("0x" + ByteStrings[i]));
}
return ByteOut;
}
你想把十六进制转换为十进制:
其实不用转换,接收来的是字节数组,数组都是十进制的。 只是你要按16进制去发送。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
namespace GSM.Cls
{
class ReadComm
{
internal class CommReader
{
//单个缓冲区最大长度
private const int max = 6;
//数据计数器
private int count = 0;
private int countData = 1;
//变长标志数
//private int bufCount = 0;
//数字缓冲区
private Byte[] buffer = new Byte[max];
///
/// 串口控件
///
private SerialPort _Comm;
///
/// 扫描的时间间隔 单位毫秒
///
private Int32 _interval;
//数据处理函数
public delegate void HandleCommData(Byte[] data,SerialPort sPort);
//事件侦听
public event HandleCommData Handlers;
//负责读写Comm的线程
private Thread _workerThread;
internal CommReader(SerialPort comm, Int32 interval)
{
_Comm = comm;
//创建读取线程
_workerThread = new Thread(new ThreadStart(ReadComm));
//确保扫描时间间隔不要太小,造成线程长期占用cpu
if (interval < 10)
_interval = 10;
else
_interval = interval;
}
//读取串口数据,为线程执行函数
public void ReadComm()
{
while (true)
{
Object obj = null;
try
{
//每隔一定时间,从串口读入一字节
//如未读到,obj为null
obj = _Comm.ReadByte();
}
catch
{
}
if (obj == null)
{ //未读到数据,线程休眠
Thread.Sleep(_interval);
continue;
}
//将读到的一字节数据存入缓存,这里需要做一转换
buffer[count] = Convert.ToByte(obj);
if(buffer[0] == 0xFE )
{
count++;
}
//计算接收数据的结束位
//当达到指定长度时,这里的判断条件可以根据要求变为:
// 判断当前读到的字节是否为结束位,等等
//计算结束标志位,协议为除了开始标志位的其他数据值的异或值
if (count == 6 && buffer[1]==0x04)//我的接收规则是6位长度,第二个字节是0x04
{
//复制数据,并清空缓存,计数器也置零
Byte[] data = new Byte[6];//bufCount
//Array.Copy(buffer, data, bufCount);
Array.Copy(buffer, 0, data, 0, 6);
count = 0;
Array.Clear(buffer, 0, max);
//通知处理器处理数据
if (Handlers != null)
Handlers(data,_Comm);
}
if(count ==6 && buffer[1] != 0x04)
{
Array.Clear(buffer, 0, max);
count=0;
}
}
}
//启动读入器
public void Start()
{
//启动读取线程
if (_workerThread.IsAlive)
return;
if (!_Comm.IsOpen)
_Comm.Open();
_workerThread.Start();
while (!_workerThread.IsAlive);
}
//停止读入
public void Stop()
{
//停止读取线程
if (_workerThread.IsAlive)
{
_workerThread.Abort();
_workerThread.Join();
}
_Comm.Close();
}
}
}
}
// 把十六进制字符串转换成字节型和把字节型转换成十六进制字符串
public static string ByteToString(byte[] InBytes)
{
string StringOut = "";
foreach (byte InByte in InBytes)
{
StringOut = StringOut + String.Format("{0:X2} ", InByte);
}
return StringOut;
}
public static byte[] StringToByte(string InString)
{
string[] ByteStrings;
ByteStrings = InString.Split(" ".ToCharArray());
byte[] ByteOut;
ByteOut = new byte[ByteStrings.Length - 1];
for (int i = 0; i == ByteStrings.Length - 1; i++)
{
ByteOut[i] = Convert.ToByte(("0x" + ByteStrings[i]));
}
return ByteOut;
}
你想把十六进制转换为十进制:
其实不用转换,接收来的是字节数组,数组都是十进制的。 只是你要按16进制去发送。
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
单片机汇编程序是用汇编语言编写的程序,用于控制单片机的操作。汇编语言是一种比较接近计算机硬件语言的低级语言,相对于高级语言来说更容易理解和实现。下面是单片机汇编程序的基本步骤:1. 将代码和数据汇编到规定的段中。2. 在存储器中用未初始化的...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
将16进制的每个数字直接转化成二进制,比如 1=0001 f=1111
然后将二进制序列按公式转化成十进制
只说思想,代码不会花时间给你写
然后将二进制序列按公式转化成十进制
只说思想,代码不会花时间给你写
参考资料: sername
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
作者:彭军
发送串口数据:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace SendData
{
class Program
{
static void Main(string[] args)
{
SerialPort port = new SerialPort();
Console.WriteLine("串口(如COM1):");
port.PortName = Console.ReadLine();
Console.WriteLine("波特率:");
port.BaudRate = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("数据位:");
port.DataBits = Convert.ToInt32(Console.ReadLine());
int stopBits = 0;
Console.WriteLine("停止位:");
stopBits = Convert.ToInt32(Console.ReadLine());
switch (stopBits)
{
case 0:
port.StopBits = StopBits.None;
break;
case 1:
port.StopBits = StopBits.One;
break;
case 2:
port.StopBits = StopBits.Two;
break;
default:
port.StopBits = StopBits.None;
break;
}
try
{
port.Open();
string sendData="";
bool exitFlag=false;
while (exitFlag == false)
{
Console.WriteLine("要发送的数据:");
sendData = Console.ReadLine();
if (sendData.CompareTo("exit") == 0)
break;
else
port.WriteLine(sendData);
}
port.Close();
}
catch(Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
}
}
接受串口数据:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace RecvData
{
class Program
{
static void Main(string[] args)
{
SerialPort port = new SerialPort();
Console.WriteLine("串口(如COM1):");
port.PortName = Console.ReadLine();
Console.WriteLine("波特率:");
port.BaudRate = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("数据位:");
port.DataBits = Convert.ToInt32(Console.ReadLine());
int stopBits = 0;
Console.WriteLine("停止位:");
stopBits = Convert.ToInt32(Console.ReadLine());
switch (stopBits)
{
case 0:
port.StopBits = StopBits.None;
break;
case 1:
port.StopBits = StopBits.One;
break;
case 2:
port.StopBits = StopBits.Two;
break;
default:
port.StopBits = StopBits.None;
break;
}
try
{
port.Open();
bool exitFlag = false;
int n = 0;
while (exitFlag == false)
{
Console.WriteLine(port.ReadLine());
n++;
if (n == 999999)
{
Console.WriteLine("是否继续?(y/s)");
string ans = Console.ReadLine();
if (ans.CompareTo("y") == 0)
exitFlag = true;
else
n = 0;
}
}
port.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
}
}
//十进制转十六进制
Console.WriteLine(Convert.ToString(69, 16));
呵呵!我没试过这样行不?我还是新手,你试试!
发送串口数据:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace SendData
{
class Program
{
static void Main(string[] args)
{
SerialPort port = new SerialPort();
Console.WriteLine("串口(如COM1):");
port.PortName = Console.ReadLine();
Console.WriteLine("波特率:");
port.BaudRate = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("数据位:");
port.DataBits = Convert.ToInt32(Console.ReadLine());
int stopBits = 0;
Console.WriteLine("停止位:");
stopBits = Convert.ToInt32(Console.ReadLine());
switch (stopBits)
{
case 0:
port.StopBits = StopBits.None;
break;
case 1:
port.StopBits = StopBits.One;
break;
case 2:
port.StopBits = StopBits.Two;
break;
default:
port.StopBits = StopBits.None;
break;
}
try
{
port.Open();
string sendData="";
bool exitFlag=false;
while (exitFlag == false)
{
Console.WriteLine("要发送的数据:");
sendData = Console.ReadLine();
if (sendData.CompareTo("exit") == 0)
break;
else
port.WriteLine(sendData);
}
port.Close();
}
catch(Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
}
}
接受串口数据:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace RecvData
{
class Program
{
static void Main(string[] args)
{
SerialPort port = new SerialPort();
Console.WriteLine("串口(如COM1):");
port.PortName = Console.ReadLine();
Console.WriteLine("波特率:");
port.BaudRate = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("数据位:");
port.DataBits = Convert.ToInt32(Console.ReadLine());
int stopBits = 0;
Console.WriteLine("停止位:");
stopBits = Convert.ToInt32(Console.ReadLine());
switch (stopBits)
{
case 0:
port.StopBits = StopBits.None;
break;
case 1:
port.StopBits = StopBits.One;
break;
case 2:
port.StopBits = StopBits.Two;
break;
default:
port.StopBits = StopBits.None;
break;
}
try
{
port.Open();
bool exitFlag = false;
int n = 0;
while (exitFlag == false)
{
Console.WriteLine(port.ReadLine());
n++;
if (n == 999999)
{
Console.WriteLine("是否继续?(y/s)");
string ans = Console.ReadLine();
if (ans.CompareTo("y") == 0)
exitFlag = true;
else
n = 0;
}
}
port.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
}
}
//十进制转十六进制
Console.WriteLine(Convert.ToString(69, 16));
呵呵!我没试过这样行不?我还是新手,你试试!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询