C#中如何接收串口的16进制数据,并将其转换成10进制形式

我是刚学C#,对串口通信不太懂,如果可以,麻烦你将整个过程代码贴出,不好意思,目前只剩15分了,谢谢!... 我是刚学C#,对串口通信不太懂,如果可以,麻烦你将整个过程代码贴出,不好意思,目前只剩15分了,谢谢! 展开
 我来答
miniappFlLggxkoNJGVm
推荐于2017-09-11 · TA获得超过513个赞
知道小有建树答主
回答量:447
采纳率:0%
帮助的人:325万
展开全部
给你发一个读取串口数据的类,按需求修改接收字符串的长度和接收规则
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进制去发送。
yanchao14
2011-01-21 · TA获得超过131个赞
知道小有建树答主
回答量:245
采纳率:0%
帮助的人:159万
展开全部
将16进制的每个数字直接转化成二进制,比如 1=0001 f=1111
然后将二进制序列按公式转化成十进制
只说思想,代码不会花时间给你写

参考资料: sername

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Andy爱米
2011-01-21 · TA获得超过377个赞
知道小有建树答主
回答量:146
采纳率:0%
帮助的人:56.2万
展开全部
作者:彭军

发送串口数据:

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

呵呵!我没试过这样行不?我还是新手,你试试!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式