C# 串口通信 高低字节合并是怎么回事啊

作者&投稿:贠强 (若有异议请与网页底部的电邮联系)
C#用serialPort实现串口通信读取byte数据菜鸟求助。~

class Program
{
struct BinData
{
public byte Length; //长度 8bit
public byte[] Header; // 1,2 字节没用
public byte[] Flag;// 3,4 字节截出来
public byte Padding; // 5没用
public byte[] Data; // 7~17 有用
}

static void Main(string[] args)
{
SerialPort sp = new SerialPort("COM3");

sp.Open();
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); //注册DataReceived事件,当收到数据时调用 sp_DataReceived
while (true) { }
}

static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] buf = new byte[port.ReadBufferSize];
int len = 0;

//将数据读入内存流
MemoryStream ms = new MemoryStream();
len = port.Read(buf, 0, buf.Length);
ms.Write(buf, 0, len);

buf = ms.ToArray();
FormatData(buf); //处理数据
}
static BinData FormatData(byte[] buf)
{
BinData d = new BinData();
d.Length = buf[0];//第一字节 长度
d.Header = new byte[2] { buf[1], buf[2] }; //1,2字节没用
d.Flag = new byte[2] { buf[3], buf[4] }; // 3,4 字节截出来
d.Padding = buf[5]; //5没用
byte[] data = new byte[d.Length - 7];
Buffer.BlockCopy(buf, 7, data, 0, d.Length - 7); //截取7~长度-7 数据
d.Data = data;
return d;
}
}

byte a = 0x14; byte b = 0x5A; int c = a << 8 | b;

一般情况下单片机有8位单片,16位单片以及32位单片机。一般情况下对于8位单片的比较多,比如51单片机。所谓的8位单片,就是因单片机系中最大的寄存器为8位,当其想表示一个16bits的数时,必须发送过来两个数字,就是把16bits的数分成两个8bits时向上位机发送,换句话来说,你的8位单片机,每次只能给你发一个8bits的字节,而它要表示一个数据必须使用16bits编码时,其实需要两次发送,也就是你所说的两个字节。

但事实你必须要知道的是这两个字节是不可分的,只有这两个8bits才能表示一个完整意义。而计算机对于16bits,32bits等处理是绰绰有余的,所以计算在接收这两个数字之间必须将其合并成一个,当然单片机也有发送顺序,先发送高位,再发送低位。这时你需要将这两个得新组合。

定义一个smallint类型,接收第一个字节,并将其向左移8位,实际上是乘256也是一样的,但可能会溢出。然后再通过字节的OR操作与后一个字节,和出的结果就是合并后的结果。

从原理与算法上我感觉你应该明白高低字节合并,和为什么会出现高低字节合并了!

记得以前做wince开发的时候也有过类似的问题,高低字节这个跟通信数据格式有关系,很多时候在接受串口数据的时候一些情况下一个完整的一字节数据,它是先发送低4位数据然后在发送高四位数据,最后在PC端自己接受到数据后要重组的,这个通过简单的bit转换就OK了~

这个简单,单片机存的是16位的数据,但是你串口一次只能传送8个位,那么就分高字节低字节,一个字节8位,你先把高8位放在一个16位的变量里i = xx,然后执行i<<8;再i |= xx;这就合并了。你的i就是存了对方16位的数据

高低字节,就是一个超过255的数值时,一个字节无法容纳,就使用两个字节,这个时候就需要一个高字节和一个低字节进行存储。比如一个16位的系统,存储整数289,则对应的高字节为0x01,低字节为0x21

微机应用基础!

呵呵呵

祝好!


郏县13514834236: C# 串口通信 高低字节合并是怎么回事啊 -
野非亚旭: 一般情况下单片机有8位单片,16位单片以及32位单片机.一般情况下对于8位单片的比较多,比如51单片机.所谓的8位单片,就是因单片机系中最大的寄存器为8位,当其想表示一个16bits的数时,必须发送过来两个数字,就是把16bits的数分...

郏县13514834236: C# 串口通信 高低字节合并是怎么回事啊
野非亚旭: 记得以前做wince开发的时候也有过类似的问题,高低字节这个跟通信数据格式有关系,很多时候在接受串口数据的时候一些情况下一个完整的一字节数据,它是先发送低4位数据然后在发送高四位数据,最后在PC端自己接受到数据后要重组的,这个通过简单的bit转换就OK了~

郏县13514834236: C#16位串口数据如何处理 -
野非亚旭: 你好,你说的很清楚了,但是我没看到你的问题.RS-232也好,RS-485也好,只是用在两个设备之间的一种串行通信方式.既然你写C#的程序,也就是说,你不用关心硬件是如何实现的了,对么?一般PC上插一张RS-485的通信卡,卡的厂家...

郏县13514834236: c# 将字节进行合并,求代码. -
野非亚旭: byte a = 0x14; byte b = 0x5A; int c = a << 8 | b;...

郏县13514834236: 串口通信多字节收发怎么做 -
野非亚旭: 其实,没有那么 复杂 Private Sub ComSend1_Click() MSComm1.Output = TextSend.text End Sub 建议看书 Visual_Basic与_RS-232_串行通信控制

郏县13514834236: c# 单片机 串口通信
野非亚旭: 有很多种方式可以实现 ,这个就是定义的通信协议 1 可以 直接发送 '1' '4' '.' '2' 这四个字符 2 可以转成float 或double 格式 发送所占据内存的 4/8个字节 3 可以定义成 两个字节 第一个字节发送 14 第二个发送 2 …… 所有这些 加上起始、地址、结束、校验等(这些都可选,也可以无) 可以构成一个完整的一帧 发送给单片机. 单片机 再受到之后,按照发送的思路 在解码出来 就是完整的通讯过程 具体怎么发 还是自己定义的 (当然最好参考下Modbus协议,很规范的)

郏县13514834236: C#中 怎么把串口和协议连接在一起 -
野非亚旭: 串口通讯和协议是两回事.首先要编程实现串口通讯,然后对串口按照协议要求发送正确的字节数组就可以了.特定协议的实现需要单独编程处理,生成正确的字节数组,向串口发送.

郏县13514834236: 用c#实现串口通信设计,有好多弄不清楚啊,求大神指教啊!!! -
野非亚旭: 文本框输入数据,传输前在数据前加上帧头帧尾,信息位这些东西.另一方,接收端收到所有数据,解析,去掉帧头帧尾、信息位,再将最后的数据显示出来.你说的完全正确.

郏县13514834236: C++想改一下 串口传输方式,怎么从原来的按字节(低位在前)改成SPI按位(高位在前)发送 -
野非亚旭: 串口通信协议就是小端模式传输数据,这个跟你使用什么编程语言没有关系,都无法改变.如果想兼容SPI,我觉得你可以在将串口数据在发送前,对数据位做一下颠倒处理,这样接收端就可以一致处理.

郏县13514834236: C#如何实现串口收发字节的功能 -
野非亚旭: C#实现串口通信,主要是靠“SerialPort”类,你直接搜这个类,就应该可以看到实例

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网